18

SQLAlchemySessionオブジェクトがあり、それが汚れているかどうかを知りたいです。私が(比喩的に)尋ねたい正確な質問Sessionは、「この時点で acommit()または aを発行した場合rollback()、データベースへの影響は同じかどうか?」です。

理由は次のとおりです。変更を確認するかどうかをユーザーに尋ねたいのです。でも、変わらないなら何も聞かないで欲しいです。もちろん、 で実行するすべての操作を自分で監視して、Session変更があったかどうかを判断することもできますが、プログラムの構造上、かなり複雑な変更が必要になる場合があります。SQLAlchemy がすでにこの機会を提供しているのであれば、喜んで利用したいと思います。

みんなありがとう。

4

4 に答える 4

14

セッションのトランザクションの全スパンで進行した実際のフラッシュの正味の数を探しています。これが発生したかどうかの手がかりはいくつかありますが (「スナップショット」と呼ばれます)、この構造は単にロールバックを支援するためのものであり、強力な参照ではありません。これへの最も直接的なルートは、「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)
于 2013-04-29T19:44:46.140 に答える
3

セッションにダーティ属性があります

session.dirty

現在変更が検出されている永続オブジェクト (このコレクションは、プロパティが呼び出されるたびにオンザフライで作成されるようになりました)

sqlalchemy.orm.session.Session.dirty

于 2013-04-27T21:43:54.533 に答える
0

セッションには_is_clean()、データベースにフラッシュするものが何もない場合に true を返すように見えるプライベート メンバーがあります。ただし、プライベートであるということは、外部での使用には適していないことを意味する場合があります。ここで間違いを犯すと、明らかにユーザーのデータが失われる可能性があるため、これを個人的に推奨することはできません。

于 2013-04-27T21:26:04.840 に答える