Как искать наличие базы данных с 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
, а затем подключиться к вновь созданной базе данных.