我需要用 python sqlalchemy 编写一个脚本来搜索数据库是否存在,如果数据库存在,它应该查询数据库,否则创建数据库和表。
伪代码:
if db exists cursor.execute(sql)
else
create db test;
create tables;
insert data;
我需要用 python sqlalchemy 编写一个脚本来搜索数据库是否存在,如果数据库存在,它应该查询数据库,否则创建数据库和表。
伪代码:
if db exists cursor.execute(sql)
else
create db test;
create tables;
insert data;
您可以使用该方法,如果数据库不存在,该sqlalchemy.engine.base.Engine.connect()
方法将引发 a 。OperationalError
import sqlalchemy as sqla
from sqlalchemy import create_engine
from sqlalchemy.exc import OperationalError
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
# ...
如果您不介意导入其他库,另一种方法是使用 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
我不知道规范的方法是什么,但这是一种通过检查数据库列表来检查数据库是否存在的方法。
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))
创建一个连接到数据库并执行通用查询的引擎,例如SELECT 1;
. 如果失败,您可以创建数据库。但是,如何创建新数据库取决于 DBMS。
使用 PostgreSQL,您将连接到postgres
数据库并发出一条CREATE DATABASE
语句,然后连接到新创建的数据库。
如果您决定使用 sqlalchemy_utils,请确保将 connect_args 作为查询字符串应用。database_exists
否则,当函数重新创建 sqlalchemy 引擎时,这些参数将不会被保留
from sqlalchemy import create_engine
from sqlalchemy_utils import database_exists
connect_args = {'charset': 'utf8'}
connect_args['ssl_cert'] = 'certs/client-cert.pem'
connect_args['ssl_key'] = 'certs/client-key.pem'
connect_args['ssl_ca'] = 'certs/server-ca.pem'
engine = create_engine(os.environ['MYSQL_CONN_URL'] + '/' + os.environ['DB_NAME'] + '?' + urlencode(connect_args))
print(database_exists(engine.url))
安装 pip 包
pip install sqlalchemy_utils
检查 database_exists
from sqlalchemy import create_engine
from sqlalchemy_utils import database_exists
engine = create_engine('postgresql://postgres@localhost/name')
database_exists(engine.url)