En utilisant SQLAlchemy, un objet Engine est créé comme ceci:
from sqlalchemy import create_engine
engine = create_engine("postgresql://localhost/mydb")
L'accès engine
échoue si la base de données spécifiée dans l'argument à create_engine
(dans ce cas, mydb
) n'existe pas. Est-il possible de dire à SQLAlchemy de créer une nouvelle base de données si la base de données spécifiée n'existe pas?
python
sqlalchemy
Anand Chitipothu
la source
la source
Réponses:
Sur postgres, trois bases de données sont normalement présentes par défaut. Si vous pouvez vous connecter en tant que superutilisateur (par exemple, le
postgres
rôle), vous pouvez vous connecter aux bases de donnéespostgres
outemplate1
. Le pg_hba.conf par défaut permet uniquement à l'utilisateur Unix nommépostgres
d'utiliser lepostgres
rôle, donc le plus simple est de devenir cet utilisateur. Dans tous les cas, créez un moteur comme d'habitude avec un utilisateur qui a les autorisations pour créer une base de données:engine.execute()
Cependant, vous ne pouvez pas utiliser , car postgres ne vous permet pas de créer des bases de données dans des transactions et sqlalchemy essaie toujours d'exécuter des requêtes dans une transaction. Pour contourner cela, obtenez la connexion sous-jacente du moteur:Mais la connexion sera toujours à l'intérieur d'une transaction, vous devez donc terminer la transaction ouverte avec un
commit
:Et vous pouvez ensuite créer la base de données en utilisant la commande PostgreSQL appropriée.
la source
conn.execute('drop database DBWithCaps')
j'ai eu des problèmes avec le fait de ne pas reconnaître les casquettes.conn.execute('drop database "DBWithCaps"')
(avec les guillemets) a bien fonctionné.SQLAlchemy-Utils fournit des types de données personnalisés et diverses fonctions utilitaires pour SQLAlchemy. Vous pouvez installer la version officielle la plus récente en utilisant pip:
Les assistants de base de données incluent une
create_database
fonction:la source
psycopg2.OperationalError: fe_sendauth: no password supplied
. Lors de l'utilisation"postgres://test:abc123@localhost:5432/test"
je reçoispsycopg2.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.
Il est possible d'éviter la gestion manuelle des transactions lors de la création de la base de données en fournissant
isolation_level='AUTOCOMMIT'
à lacreate_engine
fonction:De plus, si vous n'êtes pas sûr que la base de données n'existe pas, il existe un moyen d'ignorer l'erreur de création de base de données due à l'existence en supprimant l'
sqlalchemy.exc.ProgrammingError
exception:la source
Veuillez noter que je n'ai pas pu obtenir les suggestions ci-dessus avec
database_exists
car chaque fois que je vérifie si la base de données existe en utilisant sinon,database_exists(engine.url):
j'obtiens cette erreur:Aussi
contextlib/suppress
ne fonctionnait pas et je ne suis pas en utilisantpostgres
donc j'ai fini par faire cela pour ignorer l'exception si la base de données se produit déjà exister avec SQL Server:la source