2013-02-25 16 views

答えて

1

がデータベースに接続し、SELECT 1;のような普遍的なクエリを実行エンジンを作成します。失敗した場合は、DBを作成することができます。しかし、新しいデータベースを作成する方法はDBMSによって異なります。

PostgreSQLでは、postgresデータベースに接続し、CREATE DATABASE文を発行して、新しく作成したデータベースに接続します。

+0

私はデータベースが既に存在しているので、私が普遍的なクエリを作成すると、それらは選択され、必要なものは作成されません。私は、データベースクエリを作成していない場合は、mysqlに相当するsqlalchemyが存在することを期待していました。 – Herb21

+0

「普遍的な」とは、すべてのSQLデータベースで動作することを意味します。使用しているバックエンドはわかりません。 'create_engine(my_target_dsn).execute( 'select 1')'はあなたの既存のプールに干渉しません。 –

+0

私の悪い私はあなたが私はそれを考えて得るが、それは非常にプレーン簡単な私はそれが動作すると思っていないようだ。ところで、私はpythonとsqlalchemyを使っています – Herb21

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 
    # ... 
8

他のライブラリをインポートしても構わない場合は、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

私は、標準的な方法が何であるかを知っているが、ここでのデータベースは、データベースのリストに照らしてチェックすることにより、存在するかどうかを確認する方法ですありません。

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)) 
関連する問題