Используя SQLAlchemy, объект Engine создается следующим образом:
from sqlalchemy import create_engine
engine = create_engine("postgresql://localhost/mydb")
Доступ engine
не удается, если база данных, указанная в аргументе create_engine
(в данном случае mydb
), не существует. Можно ли указать SQLAlchemy создать новую базу данных, если указанная база данных не существует?
python
sqlalchemy
Ананд Читипоту
источник
источник
Ответы:
В postgres по умолчанию обычно присутствуют три базы данных. Если вы можете подключиться как суперпользователь (например, с
postgres
ролью), вы можете подключиться к базам данныхpostgres
илиtemplate1
. По умолчанию pg_hba.conf разрешаетpostgres
использоватьpostgres
роль только указанному пользователю unix , поэтому проще всего просто стать этим пользователем. В любом случае создайте движок как обычно с пользователем, у которого есть разрешения на создание базы данных:Однако вы не можете использовать
engine.execute()
, потому что postgres не позволяет создавать базы данных внутри транзакций, а sqlalchemy всегда пытается запускать запросы в транзакции. Чтобы обойти это, получите базовое соединение от движка:Но соединение по-прежнему будет внутри транзакции, поэтому вы должны завершить открытую транзакцию с помощью
commit
:Затем вы можете приступить к созданию базы данных, используя для этого соответствующую команду PostgreSQL.
источник
conn.execute('drop database DBWithCaps')
меня были проблемы с тем, что он не распознал колпачки.conn.execute('drop database "DBWithCaps"')
(с кавычками) работал нормально.SQLAlchemy-Utils предоставляет настраиваемые типы данных и различные служебные функции для SQLAlchemy. Вы можете установить самую последнюю официальную версию с помощью pip:
В помощники базы данных включают в себя
create_database
функции:источник
psycopg2.OperationalError: fe_sendauth: no password supplied
. При использовании"postgres://test:abc123@localhost:5432/test"
получаюpsycopg2.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.
Это позволяет избежать ручного управления транзакциями при создании базы данных, предоставляя
isolation_level='AUTOCOMMIT'
дляcreate_engine
функции:Также, если вы не уверены, что база данных не существует, есть способ игнорировать ошибку создания базы данных из-за ее существования, подавив
sqlalchemy.exc.ProgrammingError
исключение:источник
Обратите внимание, что я не мог получить вышеуказанные предложения,
database_exists
потому что всякий раз, когда я проверяю, существует ли база данных, используя if not,database_exists(engine.url):
я получаю эту ошибку:Также
contextlib/suppress
не работал, и я не использую,postgres
поэтому я сделал это, чтобы игнорировать исключение, если база данных уже существует с SQL Server:источник