SQLAlchemy自动提交?

时间:2010-03-12 12:06:29

标签: python transactions 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 个答案:

答案 0 :(得分:1)

你是对的,因为更改不是提交到DB。但是当您执行查询时,SQLAlchemy会自动刷新,在您的情况下,在带有断言的行上执行刷新。因此,如果您不明确地调用commit,您将永远不会在实际数据中看到DB中的这些更改。但是,只要您使用相同的conn对象,就会恢复它们。

您可以将autoflush=False传递给会话构造函数来禁用此行为。