2011-06-28 22 views
54

は、エンジンは、このように作成されます。SQLAlchemyを使用して新しいデータベースを作成するには? SQLAlchemyので

from sqlalchemy import create_engine 
engine = create_engine("postgresql://localhost/mydb") 

は、データベースが存在しない場合engineが失敗したアクセス。指定されたデータベースが存在しない場合、新しいデータベースを作成するようにSQLAlchemyに指示できますか?

+2

新しいデータベースまたはテーブルだけを作成しますか?私は実際にデータベースを作成する多くのORMに遭遇していません。 –

+4

私は[この](http://www.mail-archive.com/[email protected]/msg05520.html)を見つけました –

+1

役に立つ:http://sqlalchemy-utils.readthedocs.org/en/latest/database_helpers .html –

答えて

66

postgresでは、デフォルトで3つのデータベースが通常存在します。スーパーユーザー(たとえばpostgresロール)として接続できる場合は、postgresまたはtemplate1データベースに接続できます。デフォルトのpg_hba.confは、postgresという名前のUNIXユーザーのみがpostgresロールを使用することを許可しているので、最も単純なのはそのユーザーになることです。 Postgresはあなたが取引の内部データベースを作成することはできませんので、

>>> engine = sqlalchemy.create_engine("postgres://[email protected]/postgres") 

あなたはしかしengine.execute()を使用することはできません、とSQLAlchemyのは常にしようとします:任意のレートでは、データベースを作成する権限を持つユーザーでいつものようにエンジンを作成トランザクション内でクエリを実行します。これを回避するには、エンジンからの基になる接続を取得:

>>> conn = engine.connect() 

をしかし、あなたはcommitとのオープン・トランザクション終了する必要がありますので接続が、トランザクションの内部で次のようになります。

>>> conn.execute("commit") 

をと適切なPostgreSQLコマンドを使用してデータベースを作成することができます。 isolation_level='AUTOCOMMIT'create_engineする機能を提供することで、データベースを作成中

>>> conn.execute("create database test") 
>>> conn.close() 
+2

これは私のためにうまくいった。ちなみに、私が 'conn.execute( 'drop database DBWithCaps')を実行したとき、私はキャップを認識できないという問題を抱えていました。 'conn.execute( 'ドロップデータベース" DBWithCaps "')'(引用符付き)はうまくいきました。 – KobeJohn

+0

PostgreSQLは引用符で囲まれていない限り、すべてのエンティティが小文字であることを期待しています。したがって、MyColumnを使用してフィールドを作成した場合、一部のデータベースではmycolumnと見なされます。つまり、テーブルをどのように作成したかはわかりませんが、引用符を使用して作成した場合は大文字と小文字が区別されるため、SQLステートメントでアクセスすると引用符も必要になります。 – guyarad

3

これは、手動トランザクション管理を回避することが可能です:

import sqlalchemy 

with sqlalchemy.create_engine(
    'postgresql:///postgres', 
    isolation_level='AUTOCOMMIT' 
).connect() as connection: 
    connection.execute('CREATE DATABASE my_database') 

また、あなたは、データベースが存在しないことを確認していない場合は、データベースを無視する方法がありますsqlalchemy.exc.ProgrammingError例外を抑制することによって存在による作成エラーは:

import contextlib 
import sqlalchemy.exc 

with contextlib.suppress(sqlalchemy.exc.ProgrammingError): 
    # creating database as above 
+0

データベースを指定せずにprogresサーバに接続することはできないようですので、デフォルトの "postgres"データベースに接続してdb作成コマンドを実行することをお勧めします。そうしないと、デフォルトの " 「ユーザ」データベースを作成し、存在しない場合は文句を言います。 – Acorn

52

を参照してください。

from sqlalchemy import create_engine 
from sqlalchemy_utils import database_exists, create_database 

engine = create_engine("postgres://localhost/mydb") 
if not database_exists(engine.url): 
    create_database(engine.url) 

print(database_exists(engine.url)) 
関連する問題