【问题标题】:How to get the original value of changed fields in sqlalchemy after session.flush()?session.flush() 后如何获取 sqlalchemy 中更改字段的原始值?
【发布时间】:2017-02-23 09:20:25
【问题描述】:

我有个小问题类似于Getting fields history before flush

这是我的代码:

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 和会话的“脏”属性。但是当我做 session.flush() 这个方法显示不正确的结果并且“脏”是空的。

但是,我可以在 session.flush() 之后使用 session.rollback() 回滚这些更改。 这就是为什么我认为可以获得原始值的原因。他们只是躲在某个地方。

但是在哪里呢?

【问题讨论】:

    标签: python sqlalchemy flush


    【解决方案1】:

    session.flush() 将所有挂起的对象创建、删除和修改写入数据库作为 INSERT、DELETE、UPDATE 等

    因此,当您调用 session.flush() 时,您添加的对象 session(session.add(object)) 会进入数据库,但在提交 (session.commit()) 或回滚发生之前,它们不会永久写入。

    您的问题的答案:您的对象在数据库中,session.flush()

    【讨论】:

    • 但是回滚如何获得对象的先前状态?所以,我执行了session.flush(),我的更改进入了数据库。之前和当前的状态都存储在那里。我理解正确吗?但是我可以在不执行回滚的情况下获得以前的状态吗?喜欢user.get_history_after_flush()
    • 我没有数据库服务器管理它,但是当您调用 flush() 时,更改会转到数据库。有一点需要注意;此更改仅适用于该会话。这意味着不会通过另一个会话检索此更改。如果你做了一个提交,那么你就不能返回以前的值。
    猜你喜欢
    • 2011-04-08
    • 1970-01-01
    • 2017-06-07
    • 2013-09-22
    相关资源
    最近更新 更多