32

次のようなスキーマ引数を持つ SqlAlchemy モデルがあります。

Base = declarative_base()

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

私が正しく使用すると、そのようにスキーマ名を前に付けてBase.metadata.create_all(engine)a を発行しますが、Postgresqlはスキーマが存在しないと正しく不平を言います。CREATE TABLECREATE TABLE my_schema.roads (

SqlAlchemy に を発行させる手順がCREATE SCHEMA my_schemaありませんか、それとも手動で呼び出す必要がありますか?

4

3 に答える 3

42

次のように、db init スクリプトで手動で実行しました。

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

しかし、これは私が予想していたよりも魔法のようには見えません。

于 2012-12-03T05:41:30.347 に答える
31

私は同じ問題に遭遇し、DDL を発行する「最もクリーンな」方法は次のようなものだと考えています。

from sqlalchemy import event
from sqlalchemy.schema import CreateSchema

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

これにより、ベースのメタデータに含まれる何かが作成される前に、そのスキーマがあることが保証されます。ただし、これはスキーマが既に存在するかどうかをチェックしません。

コールバックCreateSchema('my_schema').execute_if(callback_=check_schema)を書くのが面倒な場合は、それを行うことができます (ドキュメントの「DDL シーケンスの制御」)。または、簡単な方法として、代わりに (Postgres の場合) を使用します。check_schemashould_createDDL("CREATE SCHEMA IF NOT EXISTS my_schema")

from sqlalchemy import DDL

event.listen(Base.metadata, 'before_create', DDL("CREATE SCHEMA IF NOT EXISTS my_schema"))
于 2014-03-06T00:10:32.297 に答える