【问题标题】:What is the difference between session.commit() and session.flush()?session.commit() 和 session.flush() 有什么区别?
【发布时间】:2011-11-20 06:03:52
【问题描述】:

有人知道 SQLAlchemy 中 session.commit()session.flush() 之间的主要区别是什么吗?

【问题讨论】:

标签: sqlalchemy


【解决方案1】:

直接来自the documentation

commit() 用于提交当前事务。它总是预先发出flush() 以将任何剩余状态刷新到数据库。

【讨论】:

    【解决方案2】:

    以下是来自documentation 的一些相关引述。

    刷新

    Session 与其默认配置一起使用时,刷新 step 几乎总是透明地完成。具体来说,同花顺 在发出任何单独的查询之前发生,以及在 commit() 在事务提交之前调用

    提交

    commit() 用于提交当前事务。 总是有问题 flush() 预先将任何剩余状态刷新到数据库;这 独立于“自动冲洗”设置。如果没有交易 目前,它会引发错误。请注意,默认行为 Session 是一个“事务”总是存在的;这种行为可以 通过设置autocommit=True 禁用。在自动提交模式下,一个 事务可以通过调用begin()方法发起。

    【讨论】:

      【解决方案3】:

      我知道如何解释这些功能的最简单方法就是向您展示,使用echo=True

      >>> session.flush()
      BEGIN (implicit)
      INSERT INTO users (username, password) VALUES (?, ?)
      ('alice', None)
      >>> session.commit()
      COMMIT
      >>> 
      

      flush() 导致将数据发送到数据库。 commit() 导致COMMIT,它告诉数据库保留刚刚发送的数据。正如其他人所说,commit() 也会导致 flush() 发生,如果需要的话。

      【讨论】:

        【解决方案4】:

        虽然上面的答案是正确的,flush 最有用的特性是将对数据库中的表所做的更改应用回代码中的相关对象。这是一个例子, 假设你注册了一个用户,你想把他的 id 还给他,

        u = User(name,address,phone) #id is autogenerated 
        session.add(u)
        session.commit() #calls flush beforehand, but we need it after the commit
        session.flush() #updates the objects of the session 
        print(u.id) #id field of the User object updated after the flush
        

        您无需再次查询即可获得他的身份!希望这会有所帮助

        【讨论】:

          【解决方案5】:

          flush() 会将您的数据库与内存中保存的对象/对象的当前状态同步,但它不会提交事务。因此,如果在调用flush() 后出现任何异常,则事务将回滚。 您可以使用 flush() 将您的数据库与小块数据同步,而不是使用 commit() 一次提交大量数据,并面临出现 Out Of Memory 异常的风险。

          commit() 将使存储在数据库中的数据永久化。一旦commit() 成功,您将无法回滚您的事务。

          来源:https://stackoverflow.com/a/26976077/4115031

          【讨论】:

            猜你喜欢
            • 2011-03-14
            • 2010-10-02
            • 2011-12-12
            • 2010-09-16
            • 2012-03-14
            • 2012-02-06
            • 2011-02-25
            • 2011-11-22
            • 2015-03-26
            相关资源
            最近更新 更多