2012-12-03 12 views
12

でcreate schemaを発行するにあたって、私はそうのようなスキーマを引数とSQLAlchemyのモデルを持っている:私はBase.metadata.create_all(エンジン)を使用する場合SQLAlchemyのはcreate_all

Base = declarative_base() 

class Road(Base): 
    __tablename__ = "roads" 
    __table_args__ = {'schema': 'my_schema'} 
    id = Column(Integer, primary_key=True) 

それは正しく、スキーマにCREATE TABLEを発行"CREATE TABLE my_schema.roads("しかし、PostgreSQLは正しくスキーマが存在しないと文句を言う。

私はCREATE SCHEMA my_schemaを発行するためにSqlAlchemyを取得するステップがないか、これは手動でですか?

答えて

19

私はしました私のdb initスクリプトを手動で実行すると、次のようになります。

from sqlalchemy.schema import CreateSchema 
engine.execute(CreateSchema('my_schema')) 

これは私が予想していたより魔法のようではありません。

+15

まずスキーマを作成する必要がありますか?ユニコーンはどこですか? – Purrell

+0

この回答を投稿したのはかなり長いことですが、新しく作成したスキーマでどのようにテーブルを移行したのか教えてください。 – Emu

9

私は同じ問題に遭遇し、DDLを発行する「クリーン」な方法は、このようなものであると信じて:これはあなたのベースのメタデータに含まれる前に、何が作成されていることを確認します

from sqlalchemy import event 
from sqlalchemy.schema import CreateSchema 

event.listen(Base.metadata, 'before_create', CreateSchema('my_schema')) 

、あなたそのためのスキーマを持っています。ただし、スキーマがすでに存在するかどうかはチェックされません。

check_schemaコールバック(should_create:docsに「Controlling DDL Sequences」)を書くのが気になる場合は、CreateSchema('my_schema').execute_if(callback_=check_schema)とすることができます。簡単な方法として、代わりにDDL("CREATE SCHEMA IF NOT EXISTS my_schema")を使用してください(Postgres用):

from sqlalchemy import DDL 

event.listen(Base.metadata, 'before_create', DDL("CREATE SCHEMA IF NOT EXISTS my_schema")) 
+0

Postgresで新しく作成されたスキーマにのみマイグレーションを実行できますか? – Emu

+0

@Emu別の質問としてそれを聞きたいかもしれません。しかし、スキーマが存在しないかどうかを確認する必要があります。スキーマが存在しない場合は作成し、必要な移行を実行してください。これは厳密に私の答えでカバーされていません。たとえば、完全な移行ライブラリを調べることができます。 SQLAlchemy MigrateまたはAllembic。 – vicvicvic