我需要用python sqlalchemy编写一个脚本来搜索数据库是否存在,如果数据库存在,它应该查询数据库,否则创建数据库和表。
伪代码:
if db exists cursor.execute(sql)
else
create db test;
create tables;
insert data;
答案 0 :(得分:15)
您可以使用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
# ...
答案 1 :(得分:14)
如果您不介意导入其他库,另一种方法是使用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
答案 2 :(得分: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))
答案 3 :(得分:2)
创建一个连接到数据库的引擎,并执行SELECT 1;
之类的通用查询。如果失败,您可以创建数据库。如何创建新数据库取决于DBMS。
使用PostgreSQL,您将连接到postgres
数据库并发出CREATE DATABASE
语句,然后连接到新创建的数据库。
答案 4 :(得分:1)
答案 5 :(得分:0)
如果您决定使用sqlalchemy_utils,请确保将connect_args用作查询字符串。否则,当database_exists
函数recreates the sqlalchemy engine
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))
答案 6 :(得分:0)
安装pip包
.problem {
display: inline-block;
padding: 0px 10px 0;
margin-top: 30px;
}
.problem:hover {
color: red;
}
与database_exists检查
pip install sqlalchemy_utils