我应该使用autocommit = False在Sqlalchemy中调用回滚吗?

时间:2016-09-29 11:01:23

标签: sqlalchemy

我想知道在提交失败后是否应该在SQLAlchemy中调用回滚?如果发生一些错误,我想继续保存对象。我不关心交易保存。

engine = create_engine("db", convert_unicode=True, echo=False)
Session = scoped_session(sessionmaker(bind=engine, autocommit=False))

for row in data:
    try:
        Session.add(row)
        Session.commit()
    except:
        # rollback ???

        # continue saving rest of the objects
        continue

Session.remove()

1 个答案:

答案 0 :(得分:1)

如果您在没有自动提交的情况下使用Sqlachemy,则需要通过调用Transactionssession.commit()手动维护session.rollback()状态。有onetwo个有用的文档链接。

但在您的示例中,您为每个row提供了一个事务。当其中一个事务失败时,将不保存当前行,并且您的代码将为下一行生成新事务。

在这种情况下,使用autocommit=False对性能没有好处。 如果您的数据集很大,您可以尝试将其拆分为单独的块,并为每个块使用一个事务。或者使用autocommit选项,不要担心交易状态。