2013-02-25 34 views
11

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

伪代码:

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

回答

1

创建连接到数据库,并执行类似SELECT 1;通用查询引擎。如果失败,您可以创建数据库。但是,如何创建新的数据库取决于DBMS。

使用PostgreSQL,您可以连接到postgres数据库并发出CREATE DATABASE语句,然后连接到新创建的数据库。

+0

我有数据库池已在所有脑干所以如果我创建一个通用的查询会挑选那些,而不是创建一个我想要的。我希望有一个sqlalchemy相当于mysql,如果不存在create database query。 – Herb21 2013-02-26 09:46:23

+0

“通用”我的意思是它适用于所有的SQL数据库 - 我不知道你使用的是哪个后端。 'create_engine(my_target_dsn).execute('select 1')'不会干扰你现有的池。 – 2013-02-26 09:51:20

+0

我不好,我得到你我想到的,但它似乎很简单,容易,我不认为它会工作。顺便我使用python和sqlalchemy – Herb21 2013-02-26 09:55:46

9

您可以使用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

我不知道的正规途径是什么,但这里的检查,看是否通过对数据库列表中检查存在的数据库的方式。

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))