10

私は自分のormとしてsqlalchemyを使用declarativeしており、Baseとして使用しています。

Base = declarative_base()
class User(Base):
    __tablename__ = 'users'

    id = Column(Integer, primary_key=True)
    name = Column(String)

私の質問は、ユーザーが変更されたことをどのように知ることができ、クエリデータベースなしで元の値を再度取得する方法ですか?

user = Session.query(User).filter_by(id=user_id).first()
# some operations on user
....
# how do I know if the user.name has been changed or not?
...
# How do get the original name?

前もって感謝します!


アップデート

メソッドget_historyがフィールドの履歴値を取得できることを発見しましたが、それが私の目的にとって正しいメソッドであるかどうかはわかりません。

from sqlalchemy.orm.attributes import get_history
user = Session.query(User).first()
print user.name  # 'Jack'
print get_history(user, 'name') # ((),['Jack'],())

user.name = 'Mike'
print get_history(user, 'name') # (['Mike'], (),['Jack'])

の値を確認することはできますがget_history、それが最善の方法ですか?

4

1 に答える 1

12

\user変更されているかどうかを確認するには、user in session.dirty。もしそうなら、それを元に戻したいなら、あなたは実行することができます

session.rollback()

ただし、これにより、セッションのすべてが最後にロールバックされることに注意してsession.commit()ください。

元の値を取得したい場合、メモリは正しく機能します。これは、sqlalchemy.orm.attributes.get_historyユーティリティ関数によって返されるタプルの2番目の要素です。あなたはしなければならないでしょう

old_value = sqlalchemy.orm.attributes.get_history(user, 'attribute')[2]

必要な属性ごとに。

于 2010-09-05T11:09:46.927 に答える