mysqlテーブルのサブセットを「本番」レプリカから開発/テストシステムに定期的に「コピー」するために使用するスクリプトでSAを使用しています。ソーステーブルとを単純に反映するコードを記述しましたmeta.create_all(destination_engine)
。use_alter=True
FKの性質上、CircularDependencyErrorsやその他の問題が発生しないように、テーブルを作成するときにテーブルのForeignKeysに適用する必要があることがわかりました。メタデータを調べるまで、FKの数や名前がわからないと想定する必要があります。
私はSAに不慣れで、通常はJavaプログラマーです(あなたが言うように:D)。use_alter属性を変更しようとしました。最初は繰り返し:
tablesd = smeta.tables.items()
for tname, t in tablesd:
for c in t.columns:
for fk in c.foreign_keys:
fk.use_alter = True
smeta.create_all(to_engine)
編集:上記のようにuse_alterプロパティを設定した後、create_all()がCircularDependencyErrorをスローしないことに注意することが重要です。そのコードを削除すると、create_all()が機能しません。作成からFKを削除していないようです...
これは明らかに機能しませんでした。次に、SAドキュメントの「反映された列のオーバーライド」を読みました。サンプルは次のとおりです。
mytable = Table('mytable', meta,
Column('id', Integer, primary_key=True), # override reflected 'id' to have primary key
Column('mydata', Unicode(50)), # override reflected 'mydata' to be Unicode, autoload=True)
各テーブルを個別に反映use_alter=True
してからFK定義に追加することは機能すると思いますが、名前と値、またはFK/列の数を想定することはできません。私はこのようなことをするために使用することについてたくさん読みましたDeclarativeBase
、しかし私はそれがどのように機能するか本当にわかりません...
テーブルの任意のリストを取得して反映し、それぞれの外部キーのuse_alterオプションをオーバーライドするにはどうすればよいですか?私はこれを間違った方法で考えていますか?