149 votes

Comment créer une nouvelle base de données en utilisant SQLAlchemy ?

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 de 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 ?

176voto

buhtz Points 2072

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 :

 pip install sqlalchemy-utils

Les assistants de base de données incluent une fonction create_database :

 from sqlalchemy import create_engine
from sqlalchemy_utils import database_exists, create_database

engine = create_engine("postgres://localhost/mydb")
if not database_exists(engine.url):
    create_database(engine.url)

print(database_exists(engine.url))

15voto

renskiy Points 828

Il est possible d'éviter la gestion manuelle des transactions lors de la création de la base de données en fournissant la fonction isolation_level='AUTOCOMMIT' à create_engine :

 import sqlalchemy

with sqlalchemy.create_engine(
    'postgresql:///postgres',
    isolation_level='AUTOCOMMIT'
).connect() as connection:
    connection.execute('CREATE DATABASE my_database')

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'exception sqlalchemy.exc.ProgrammingError

 import contextlib
import sqlalchemy.exc

with contextlib.suppress(sqlalchemy.exc.ProgrammingError):
    # creating database as above

6voto

Elder Druid Points 301

L'extension de la réponse acceptée en utilisant with donne :

 from sqlalchemy import create_engine
engine = create_engine("postgresql://localhost")

NEW_DB_NAME = 'database_name'

with engine.connect() as conn:
    # Do not substitute user-supplied database names here.
    conn.execute(f"CREATE DATABASE {NEW_DB_NAME}")

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X