Mit SQLAlchemy wird ein Engine-Objekt wie folgt erstellt:
from sqlalchemy import create_engine
engine = create_engine("postgresql://localhost/mydb")
Der Zugriff engine
schlägt fehl, wenn die im Argument to create_engine
(in diesem Fall mydb
) angegebene Datenbank nicht vorhanden ist. Kann SQLAlchemy angewiesen werden, eine neue Datenbank zu erstellen, wenn die angegebene Datenbank nicht vorhanden ist?
python
sqlalchemy
Anand Chitipothu
quelle
quelle
Antworten:
Auf Postgres sind normalerweise standardmäßig drei Datenbanken vorhanden. Wenn Sie als Superuser eine Verbindung herstellen können (z. B. die
postgres
Rolle), können Sie eine Verbindung zu den Datenbankenpostgres
oder herstellentemplate1
. Die Standard-Datei pg_hba.conf erlaubt nur dem genannten Unix-Benutzerpostgres
, diepostgres
Rolle zu verwenden. Am einfachsten ist es also, nur dieser Benutzer zu werden. Erstellen Sie auf jeden Fall wie gewohnt eine Engine mit einem Benutzer, der über die Berechtigung zum Erstellen einer Datenbank verfügt:Sie können dies
engine.execute()
jedoch nicht verwenden , da Sie mit postgres keine Datenbanken innerhalb von Transaktionen erstellen können und sqlalchemy immer versucht, Abfragen in einer Transaktion auszuführen. Um dies zu umgehen, rufen Sie die zugrunde liegende Verbindung von der Engine ab:Die Verbindung befindet sich jedoch weiterhin innerhalb einer Transaktion. Sie müssen die geöffnete Transaktion daher mit einem
commit
folgenden Ergebnis beenden :Anschließend können Sie die Datenbank mit dem entsprechenden PostgreSQL-Befehl erstellen.
quelle
conn.execute('drop database DBWithCaps')
ich Probleme damit, die Kappen nicht zu erkennen.conn.execute('drop database "DBWithCaps"')
(mit den Anführungszeichen) hat gut funktioniert.SQLAlchemy-Utils bietet benutzerdefinierte Datentypen und verschiedene Dienstprogrammfunktionen für SQLAlchemy. Sie können die neueste offizielle Version mit pip installieren:
Die Datenbankhelfer enthalten eine
create_database
Funktion:quelle
psycopg2.OperationalError: fe_sendauth: no password supplied
. Bei der Verwendung"postgres://test:abc123@localhost:5432/test"
bekomme ichpsycopg2.OperationalError: FATAL: password authentication failed for user "test"
"postgres://test:abc123@localhost:9000/test"
psycopg2.OperationalError: server closed the connection unexpectedly This probably means the server terminated abnormally before or while processing the request.
Es ist möglich , manuelles Transaktionsmanagement zu vermeiden , während Datenbank erstellen , indem sie
isolation_level='AUTOCOMMIT'
aufcreate_engine
Funktion:Auch wenn Sie nicht sicher sind, ob die Datenbank nicht vorhanden ist, können Sie den Fehler bei der Datenbankerstellung aufgrund der Existenz ignorieren, indem Sie die
sqlalchemy.exc.ProgrammingError
Ausnahme unterdrücken :quelle
Bitte beachten Sie, dass ich die oben genannten Vorschläge nicht erhalten konnte,
database_exists
da bei jeder Überprüfung, ob die Datenbank vorhanden ist, die folgendedatabase_exists(engine.url):
Fehlermeldung angezeigt wird:Funktionierte auch
contextlib/suppress
nicht und ich verwende es nicht. Daherpostgres
habe ich dies getan, um die Ausnahme zu ignorieren, wenn die Datenbank zufällig bereits mit SQL Server vorhanden ist:quelle