Как создать новую базу данных с помощью SQLAlchemy? - PullRequest
82 голосов
/ 28 июня 2011

Используя SQLAlchemy, объект Engine создается следующим образом:

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

Доступ к engine завершается неудачно, если база данных, указанная в аргументе create_engine (в данном случае mydb), не существует. Можно ли указать SQLAlchemy создать новую базу данных, если указанная база данных не существует?

Ответы [ 3 ]

95 голосов
/ 22 июня 2015

SQLAlchemy-Utils предоставляет настраиваемые типы данных и различные служебные функции для SQLAlchemy.Вы можете установить самую последнюю официальную версию, используя pip:

pip install sqlalchemy-utils

Помощники базы данных включают функцию 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))
86 голосов
/ 23 января 2012

На postgres три базы данных обычно присутствуют по умолчанию.Если вы можете подключиться как суперпользователь (например, роль postgres), то вы можете подключиться к базам данных postgres или template1.По умолчанию pg_hba.conf разрешает использовать роль postgres только пользователю unix с именем 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()
6 голосов
/ 28 февраля 2015

Можно избежать ручного управления транзакциями при создании базы данных, предоставив isolation_level='AUTOCOMMIT' to create_engine функцию:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...