SQLAlchemy 自动提交?

1 投票
1 回答
632 浏览
提问于 2025-04-15 20:20

我在使用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 来关闭这种自动刷新的行为。

撰写回答