如何使用sqlalchemy搜索数据库的存在

时间:2013-02-25 07:42:54

标签: sqlalchemy

我需要用python sqlalchemy编写一个脚本来搜索数据库是否存在,如果数据库存在,它应该查询数据库,否则创建数据库和表。

伪代码:

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

7 个答案:

答案 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