在INSERTS中sqlalchemy回滚

时间:2012-10-25 15:51:38

标签: python sqlite sqlalchemy rollback

我有一个小问题。我将一长串数据插入到数据库中,但可能会发生一些新行抛出IntegrityError异常。那很好,我很容易认出来。问题是,当我回滚撤消这个“假”插入时,所有先前的行也被删除。

我想要做的是回滚到之前的状态并继续下一个Insert。

import sqlalchemy as alc

def insert(self, specs):
    #do stuff to transfor specs in data_db

    entry = Check_Point(data_db)
    session.add(entry)

    try:
        session.flush()

    except alc.exc.IntegrityError:
        print 'int Error'
        session.rollback()

所以,研究一下,我发现了这个:

http://docs.sqlalchemy.org/en/rel_0_7/orm/session.html#using-savepoint

for record in records:
    try:
        with session.begin_nested():
            session.merge(record)
    except:
        print "Skipped record %s" % record
session.commit()

但如果“records”是要插入的对象数组(在我的Check_Point实例中),我无法真正理解它。我收到以下错误:

  

此会话的事务已通过嵌套的rollback()调用回滚。要开始新事务,请先发出Session.rollback()

我已接近解决问题,但需要一些帮助。

提前致谢!

1 个答案:

答案 0 :(得分:2)

由于 PySQLite 错误,目前SAVEPOINT个事务无法与 SQLAlchemy SQLite3 一起正常运行。有关Michael Bayer关于错误的详细解释以及在 SQLAlchemy 中解决它的复杂性,请参阅this SQLAlchemy Google group post