データベースでは利用できないレガシーデータがいくつかの外部ファイルであるため、外部ファイルから読み取ったデータを含む SQLAlchemy オブジェクトを作成したいのですが、実行してもデータベースには書き込まれませんsession.flush()
私のコードは次のようになります。
try:
return session.query(Phone).populate_existing().filter(Phone.mac == ident).one()
except:
return self.createMockPhoneFromLicenseFile(ident)
def createMockPhoneFromLicenseFile(self, ident):
# Some code to read necessary data from file deleted....
phone = Phone()
phone.mac = foo
phone.data = bar
phone.state = "Read from legacy file"
phone.purchaseOrderPosition = self.getLegacyOrder(ident)
# SQLAlchemy magic doesn't seem to work here, probably because we don't insert the created
# phone object into the database. So we set the id fields manually.
phone.order_id = phone.purchaseOrderPosition.order_id
phone.order_position_id = phone.purchaseOrderPosition.order_position_id
return phone
アプリケーションで後で実行されると、SQLAlchemy が作成された Phone オブジェクトをデータベースに書き込もうとすることを除いて、すべて正常に動作session.flush()
します (phone.state がデータ型が許可するよりも長いため、幸いなことに成功しません)。フラッシュ。
SQLAlchemy がそのようなオブジェクトを書き込もうとするのを防ぐ方法はありますか?
アップデート
私は何も見つけられなかったが
using_mapper_options(save_on_init=False)
Elixir のドキュメント (おそらくリンクを提供できますか?) では、試してみる価値があるように思えました (エンティティ全体ではなく単一のインスタンスが書き込まれるのを防ぐ方法が望ましいでしょう)。
最初は、このステートメントは効果がないように見え、SQLAlchemy/Elixir のバージョンが古すぎるのではないかと疑っていましたが、PurchaseOrderPosition エンティティ (私は変更していません) への接続が
phone.purchaseOrderPosition = self.getLegacyOrder(ident)
電話オブジェクトが再度書き込まれます。ステートメントを削除すると、すべて問題ないようです。