有人知道SQLAlchemy中session.commit()
和session.flush()
之间的主要区别是什么?
答案 0 :(得分:15)
以下是documentation的一些相关引用。
<强>冲洗强>:
当
Session
与其默认配置一起使用时,刷新 步骤几乎总是透明地完成。具体而言,同花顺 在发出任何单个Query之前以及在此之内发生 在提交交易之前调用commit()
。
<强>提交强>:
commit()
用于提交当前事务。 它始终是问题 事先flush()
将任何剩余状态刷新到数据库;这个 独立于“autoflush”设置。如果没有交易 目前,它引发了一个错误。注意,默认行为 会话是“交易”始终存在;这种行为可以 通过设置autocommit=True
来禁用。在自动提交模式下,a 可以通过调用begin()
方法启动事务。
答案 1 :(得分:9)
我知道如何解释这些操作的最简单方法是使用echo=True
向您展示:
>>> session.flush()
BEGIN (implicit)
INSERT INTO users (username, password) VALUES (?, ?)
('alice', None)
>>> session.commit()
COMMIT
>>>
flush()
会将数据发送到数据库。 commit()
会导致COMMIT
,它告诉数据库保留刚刚发送的数据。正如其他人所说,如果需要,commit()
也会导致flush()
发生。
答案 2 :(得分:4)
直接来自the documentation:
commit()
用于提交当前事务。它总是事先发出flush()
以将任何剩余状态刷新到数据库。
答案 3 :(得分:3)
虽然上面的答案是正确的,但是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
你不需要再次查询来获取他的身份!希望这有帮助
答案 4 :(得分:0)
flush()
会将您的数据库与内存中保存的对象/对象的当前状态同步,但它不会提交事务。因此,如果在调用flush()
后出现任何异常,则将回滚该事务。 您可以使用flush()
将数据库与小块数据同步,而不是使用commit()
一次提交大量数据,并面临获得Out Of Memory
例外的风险。
commit()
会使数据库中存储的数据永久存在。commit()
成功后,您无法回滚您的交易。