【问题标题】:Update an object after session.commit() in SQLAlchemy在 SQLAlchemy 中的 session.commit() 之后更新对象
【发布时间】:2014-04-16 03:14:39
【问题描述】:

发出session.commit()更新对象是否正常工作?还是我需要刷新对象?

我认为这对这个问题来说已经足够了,但如果需要,我可能会提供更多信息来解决我的问题。

编辑:

通过更新,我的意思是设置一些属性,即对象的列值。

【问题讨论】:

    标签: sqlalchemy


    【解决方案1】:

    简短回答:不,您不需要手动刷新,sqlalchemy 会为您完成。


    知道它何时发生是很有用的,所以下面是简短的概述。 来自Session.commit()的文档:

    默认情况下,Session 也会过期所有数据库加载状态 事务提交后的 ORM 管理属性。这使得 后续操作从数据库加载最新数据。 可以使用 expire_on_commit=False 选项禁用此行为 到 sessionmaker 或 Session 构造函数。

    基本上,如果您没有设置expire_on_commit=False,则只要您在session.commit() 之后尝试访问(读取,而不是设置)其属性,对象就会自动刷新。

    my_obj = session.query(MyType).get(1)
    my_obj.field1 = 'value1'
    session.commit() # will commit and expire my_obj
    
    my_obj.field1 = 'new value' # object is still the same, but field is updated
    print my_obje.field1 # at this point SA will first refresh the object from the database; and make sure that new values for changed fields are applied
    

    事实上,如果您启用日志记录,您将看到sqlalchemy 在您访问(读取)持久实例的属性时立即发出新的SELECT 语句。

    【讨论】:

    • 我想你误读了我?我问的是 更新 一个对象,即更新一个/一些列值。您能否澄清一下,因为我认为我选择的“更新”一词可能会产生误导。
    • 好的,这与我的答案所涵盖的不同,但其中很大一部分仍然相关。所以,基本上,在我的回答 (my_obj.field1 = 'new value') 中的那一行之后,只有在内存中才会发生这种变化。为了让您的数据库反映此更改,您必须再次致电session.commmit()。这包括它吗?
    • @van 我遇到了完全相反的情况,在session.commit() 之后设置一个属性仍然使用该新属性更新数据库,即使我没有在之后运行session.commit()。因此,即使在更高版本的更新方面,似乎也可能有所改变?
    • @AndreasKlintberg,这很奇怪,我不希望这种行为会改变。只是一个猜测:除非出现错误,否则您是否有可能在退出时自动提交的“上下文管理器”中运行?例如,flask-sqlalchemy 会为 Web 请求会话执行此操作。
    • 是的,对不起,我搞砸了。没有使用正确的会话:/感谢您的帮助!是的,你是对的,它也是使用 sqlalchemy-graphene 自动提交的 :)
    猜你喜欢
    • 2021-08-20
    • 1970-01-01
    • 1970-01-01
    • 2013-12-10
    • 2020-12-17
    • 2021-05-22
    • 2018-06-15
    • 2013-10-28
    • 2019-06-28
    相关资源
    最近更新 更多