10

engineMySQLデータベースを指していると仮定します。

engine = create_engine('mysql://arthurdent:answer42@localhost/dtdb', echo=True)

dtdb次の方法でテーブルやFKなどを入力できます。

metadata.create_all(engine)

これらのDDLステートメントを実際に適用する代わりに、すべてのDDLステートメントを含むSQLファイルを生成する簡単な方法はありますdtdbか?

これまで、によって生成されたSQLAlchemyログ出力をキャプチャしecho=True、それを手動で編集することに頼ってきました。しかし、それはあまりにも苦痛です。

SAにはかなり精巧なスキーマ管理APIがあるように見えますが、スキーマ定義をテキストとして単純にストリーミングする例は見たことがありません。

4

1 に答える 1

15

簡単な答えはSQLAlchemy0.8FAQにあります。

SQLAlchemy 0.8では、次のことを行う必要があります

engine = create_engine(
'mssql+pyodbc://./MyDb',
strategy='mock',
executor= lambda sql, *multiparams, **params: print (sql.compile(dialect=engine.dialect)))

SQLAlchemy 0.9では、構文が単純化されています。

engine = create_engine(
'mssql+pyodbc://./MyDb',
strategy='mock',
executor= lambda sql, *multiparams, **params: print (sql)

より長い答えは、出力のキャプチャにはまだいくつかのわずかな問題があるということです。型のリテラルのエンコーディングと同じように。しかし、これは誰もがステップアップしてかゆみを掻くのに十分なほど大きな問題ではありませんでした。SQLAlchemyにプログラムで空のデータベースを作成させ、そこからSQLをダンプさせることができます。

より難しい問題は、スキーマ移行の処理です。これはSQLAlchemy-migrateがあなたを助けることができるところです。

于 2009-05-15T21:33:37.847 に答える