私はSQLAlchemyを使い慣れておらず、オリジナルの著者にアクセスできないやや乱雑なコードベースを継承しています。いつSQLAlchemyでflush()を呼び出す必要がありますか?
コードは、DBSession.flush()
へのコールでリラックスされています。作者がデータが保存されていることを確認したいときはいつでもそうです。最初は私がこのコードで見たパターンにちょうど従っていましたが、私はドキュメントを読んでいるので、これは不要であると思われます。さらに、「InvalidRequestError:セッションが既にフラッシングしています」というエラーを生成するAJAX呼び出しでは、いくつかのケースに遭遇しました。
どのようなシナリオで、私は合法的にflush()を呼びたいと思っていましたか?
これは、ピラミッドのアプリで、SQLAlchemyのはで設定されている:pyramid_tm
はあなたのためのすべてのコミットを処理するプロジェクトに積極的であることを
DBSession
上
DBSession = scoped_session(sessionmaker(extension=ZopeTransactionExtension(), expire_on_commit=False))
Base = declarative_base()
ありがとうございます。フォローアップ:この設定でexpire_on_commit = Falseを設定する本当に良い理由は何ですか? (私はなぜそれが最初の場所でこのように設定されたのかわかりません)。 – blocks
私の経験上、彼らは何をしているのか分からず、コミット後にオブジェクトを使ってシステムを不正行為しようとする人たちによって使用されています。 *明らかにコミット後、そのオブジェクトの状態がもう有効であるという保証はありません。 –
@Michael Merickel - 非常によく説明されています。では、flush()を使用しないでください。 [コード内にSQLAlchemy flush()を呼び出すことによる副作用はありますか?](http://stackoverflow.com/questions/29338419/are-there-any-side-effects-from-calling-sqlalchemy-flush-within-code ) –