Как создать новую базу данных с помощью SQLAlchemy?
С помощью SQLAlchemy движок создается следующим образом:
from sqlalchemy import create_engine
engine = create_engine("postgresql://localhost/mydb")
ссылке engine сбой, если база данных отсутствует. Можно ли сказать SQLAlchemy создать новую базу данных, если указанная база данных не существует?
3 ответов:
на postgres обычно присутствуют три базы данных по умолчанию. Если вы можете подключиться как суперпользователь (например,
postgresроль), то вы можете подключиться кpostgresилиtemplate1базы данных. По умолчанию файл pg_hba.conf разрешает только пользователя unix с именемpostgresиспользоватьpostgresроль, поэтому самое простое-просто стать этим пользователем. Во всяком случае, создайте движок как обычно с пользователем, который имеет разрешения на создание базы данных:>>> engine = sqlalchemy.create_engine("postgres://postgres@/postgres")вы не можете использовать
engine.execute()однако, поскольку postgres не позволяет создавать базы данных внутри транзакций, а sqlalchemy всегда пытается выполнять запросы в транзакции. Чтобы обойти это, получить базовое соединение от двигателя:>>> conn = engine.connect()но соединение все равно будет внутри транзакции, поэтому вы должны закончить открытую транзакцию с
commit:>>> conn.execute("commit")и затем вы можете приступить к созданию базы данных, используя соответствующую команду PostgreSQL для нее.
>>> conn.execute("create database test") >>> conn.close()
SQLAlchemy-Utils предоставляет пользовательские типы данных и различные служебные функции для SQLAlchemy. Вы можете установить самую последнюю официальную версию с помощью pip:
pip install sqlalchemy-utilsThe помощники по базам данных включить
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))
можно избежать ручного управления транзакциями при создании базы данных, предоставив
isolation_level='AUTOCOMMIT'до :import sqlalchemy with sqlalchemy.create_engine( 'postgresql:///postgres', isolation_level='AUTOCOMMIT' ).connect() as connection: connection.execute('CREATE DATABASE my_database')кроме того, если вы не уверены, что база данных не существует, есть способ игнорировать ошибку создания базы данных из-за существования путем подавления
sqlalchemy.exc.ProgrammingErrorисключения:import contextlib import sqlalchemy.exc with contextlib.suppress(sqlalchemy.exc.ProgrammingError): # creating database as above
Comments