SQLAlchemy 自动提交?
我在使用SQLAlchemy的时候遇到了一个问题,感觉它在自动提交数据。大概我的代码是这样的:
trans = self.conn.begin()
try:
assert not self.conn.execute(my_obj.__table__.select(my_obj.id == id)).first()
self.conn.execute(my_obj.__table__.insert().values(id=id))
assert not self.conn.execute(my_obj.__table__.select(my_obj.id == id)).first()
except:
trans.rollback()
raise
我并没有手动提交,但第二个检查总是失败!换句话说,尽管我的代码是在一个事务里,数据似乎还是被插入到了数据库里!我这样理解对吗?
1 个回答
1
你说得对,修改的内容并没有被真正保存到数据库里。但是,当你进行查询时,SQLAlchemy会自动“刷新”这些修改。在你的例子中,刷新发生在带有断言的那几行代码上。所以,如果你不明确调用 commit
,你在数据库中是看不到这些修改的,虽然在实际的数据中它们并没有消失。不过,只要你使用同一个 conn
对象,你还是能拿到这些修改。
你可以在创建会话时传入 autoflush=False
来关闭这种自动刷新的行为。