Как создать новую базу данных с помощью SQLAlchemy?



С помощью SQLAlchemy движок создается следующим образом:



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


ссылке engine сбой, если база данных отсутствует. Можно ли сказать SQLAlchemy создать новую базу данных, если указанная база данных не существует?

1130   3  

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-utils

The помощники по базам данных включить 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

    Ничего не найдено.