セッションのトランザクションの全スパンで進行した実際のフラッシュの正味の数を探しています。これが発生したかどうかの手がかりはいくつかありますが (「スナップショット」と呼ばれます)、この構造は単にロールバックを支援するためのものであり、強力な参照ではありません。これへの最も直接的なルートは、「after_flush」イベントを追跡することです。このイベントは、フラッシュが呼び出され、フラッシュがフラッシュする状態を検出した場合にのみ発生するためです。
from sqlalchemy import event
import weakref
transactions_with_flushes = weakref.WeakSet()
@event.listens_for(Session, "after_flush")
def log_transaction(session, flush_context):
for trans in session.transaction._iterate_parents():
transactions_with_flushes.add(trans)
def session_has_pending_commit(session):
return session.transaction in transactions_with_flushes
編集:これは、はるかに単純な更新バージョンです。
from sqlalchemy import event
@event.listens_for(Session, "after_flush")
def log_transaction(session, flush_context):
session.info['has_flushed'] = True
def session_has_pending_commit(session):
return session.info.get('has_flushed', False)