【发布时间】:2011-11-20 06:03:52
【问题描述】:
有人知道 SQLAlchemy 中 session.commit() 和 session.flush() 之间的主要区别是什么吗?
【问题讨论】:
-
您觉得文档的哪个方面(sqlalchemy.org/docs/orm/session.html#flushing 中的“刷新”和“提交”)不清楚?
标签: sqlalchemy
有人知道 SQLAlchemy 中 session.commit() 和 session.flush() 之间的主要区别是什么吗?
【问题讨论】:
标签: sqlalchemy
直接来自the documentation:
commit()用于提交当前事务。它总是预先发出flush()以将任何剩余状态刷新到数据库。
【讨论】:
以下是来自documentation 的一些相关引述。
刷新:
当
Session与其默认配置一起使用时,刷新 step 几乎总是透明地完成。具体来说,同花顺 在发出任何单独的查询之前发生,以及在commit()在事务提交之前调用。
提交:
commit()用于提交当前事务。 总是有问题flush()预先将任何剩余状态刷新到数据库;这 独立于“自动冲洗”设置。如果没有交易 目前,它会引发错误。请注意,默认行为 Session 是一个“事务”总是存在的;这种行为可以 通过设置autocommit=True禁用。在自动提交模式下,一个 事务可以通过调用begin()方法发起。
【讨论】:
我知道如何解释这些功能的最简单方法就是向您展示,使用echo=True:
>>> session.flush()
BEGIN (implicit)
INSERT INTO users (username, password) VALUES (?, ?)
('alice', None)
>>> session.commit()
COMMIT
>>>
flush() 导致将数据发送到数据库。 commit() 导致COMMIT,它告诉数据库保留刚刚发送的数据。正如其他人所说,commit() 也会导致 flush() 发生,如果需要的话。
【讨论】:
虽然上面的答案是正确的,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
您无需再次查询即可获得他的身份!希望这会有所帮助
【讨论】:
flush()会将您的数据库与内存中保存的对象/对象的当前状态同步,但它不会提交事务。因此,如果在调用flush()后出现任何异常,则事务将回滚。 您可以使用flush()将您的数据库与小块数据同步,而不是使用commit()一次提交大量数据,并面临出现Out Of Memory异常的风险。
commit()将使存储在数据库中的数据永久化。一旦commit()成功,您将无法回滚您的事务。
【讨论】: