Как искать наличие базы данных с sqlalchemy

Мне нужно написать script с sqlalchemy python, который ищет, если база данных существует, если существует база данных, она должна запросить базу данных, иначе создайте базу данных и таблицы.

псевдокод:

   if db exists cursor.execute(sql)
   else
      create db test;
      create tables;
      insert data;

Ответ 1

Вы можете использовать метод sqlalchemy.engine.base.Engine.connect(), который поднимет OperationalError, если база данных не существует.

import sqlalchemy as sqla
db = sqla.create_engine(database_uri)
try:
    db.connect()
    db.execute(sql)
except OperationalError:
    # Switch database component of the uri
    default_database_uri = os.path.join(os.path.dirname(
                           str(db.engine.url)), 'mysql')
    db = sqla.create_engine(default_database_uri)
    # Create your missing database/tables/data here
    # ...

Ответ 2

Альтернативный способ, если вы не против импортировать другие библиотеки, - это использовать sqlalchemy_utils. Затем database_exists выполняет то, что вы ожидаете, и вы можете передать базу данных sqlalchemy uri.

if database_exists('sqllite:////tmp/test.db'):
    do_stuff_with_db(db)

http://sqlalchemy-utils.readthedocs.org/en/latest/database_helpers.html

Ответ 3

Я не знаю, каков канонический путь, но вот способ проверить, существует ли база данных, проверяя список баз данных.

from sqlalchemy import create_engine

# This engine just used to query for list of databases
mysql_engine = create_engine('mysql://{0}:{1}@{2}:{3}'.format(user, pass, host, port))

# Query for existing databases
existing_databases = mysql_engine.execute("SHOW DATABASES;")
# Results are a list of single item tuples, so unpack each tuple
existing_databases = [d[0] for d in existing_databases]

# Create database if not exists
if database not in existing_databases:
    mysql_engine.execute("CREATE DATABASE {0}".format(database))
    print("Created database {0}".format(database))

# Go ahead and use this engine
db_engine = create_engine('mysql://{0}:{1}@{2}:{3}/{4}'.format(user, pass, host, port, db))

Здесь альтернативный метод, если вам не нужно знать, была ли создана база данных.

from sqlalchemy import create_engine

# This engine just used to query for list of databases
mysql_engine = create_engine('mysql://{0}:{1}@{2}:{3}'.format(user, pass, host, port))

# Query for existing databases
mysql_engine.execute("CREATE DATABASE IF NOT EXISTS {0} ".format(database))

# Go ahead and use this engine
db_engine = create_engine('mysql://{0}:{1}@{2}:{3}/{4}'.format(user, pass, host, port, db))

Ответ 4

Создайте движок, который подключается к базе данных и выполняет универсальный запрос, например SELECT 1;. Если это не удается, вы можете создать БД. Однако создание новой базы данных зависит от СУБД.

В PostgreSQL вы должны подключиться к базе данных postgres и выпустить инструкцию CREATE DATABASE, а затем подключиться к вновь созданной базе данных.