2017-02-23 18 views
0

私はここでGetting fields history before flushsession.flush()の後にsqlalchemyで変更されたフィールドの元の値を取得する方法は?

に似た小さな問題を持っているが、私のコードです:だから

user = User.query.filter(User.id == user_id).first() 

print(user.first_name) 
# Rick 

user.first_name = 'Anders' 

print(get_history(user, 'first_name')) 
# History(added=[u'Anders'], unchanged=(), deleted=[u'Rick']) 

db.session.flush() 

print(get_history(user, 'first_name')) 
# History(added=(), unchanged=[u'Anders'], deleted=()) 

、私は簡単にフラッシュする前に元の値を取得することができます。 get_historyとセッションの 'dirty'属性を使用できます。しかし、私がsession.flush()を実行すると、このメソッドは不正確な結果を表示し、 'dirty'は空です。

ただし、session.flush()の後にsession.rollback()を使用してこれらの変更をロールバックできます。 だからこそ私は元の値を得ることが可能だと思います。彼らはちょうどどこかに隠れている。

しかしどこですか?

答えて

0

session.flush()あなたがオブジェクトsession.flush()呼び出すとき(あなたがセッションを追加しているので、すべての保留中のオブジェクトの作成、挿入、削除などのデータベースへの削除や修正、更新、など

を書き出しますsession.add(object))はデータベースに行きますが、コミット(session.commit())またはロールバックが発生するまで永続的に書き込みません。

あなたの質問のための答え:あなたのオブジェクトがsession.flush()

+0

でデータベースにあるが、どのようにロールバックがオブジェクトの前の状態を取得していますか? 私は 'session.flush()'を実行しました。私の変更はデータベースに送られました。 そして両方の状態は、前のものと現在のものがそこに格納されます。私はそれを正しく理解していますか? ロールバックを実行せずに以前の状態に戻すことはできますか? 'user.get_history_after_flush()'のように – MrCyberthrone

+0

私はデータベースサーバーを管理していませんが、flush()を呼び出すと、データベースに変更が加えられます。気づくべきことがあります。これはそのセッションでのみ使用可能になります。これは、この変更が別のセッションで取得されないことを意味します。コミットした場合、以前の値を戻すことはできません。 – metmirr

関連する問題