如何从 psycopg2 事务中的错误中恢复?

x-y*_*uri 3 postgresql transactions psycopg2 python-3.x

我有一个从旧数据库导入数据的脚本。一路上我遇到了违反唯一约束的情况。我想修改查询并再次执行它,但它说“psycopg2.InternalError:当前事务已中止,命令被忽略,直到事务块结束”:

try:
    pcur.execute(sql, values)
except psycopg2.IntegrityError:
    value = ...
    pcur.execute(sql, values)
Run Code Online (Sandbox Code Playgroud)

如何在不切换到自动提交模式的情况下做到这一点?

x-y*_*uri 6

受到这个答案的启发:

pcur.execute('SAVEPOINT sp1')
try:
    pcur.execute(sql, values)
except psycopg2.IntegrityError:
    pcur.execute('ROLLBACK TO SAVEPOINT sp1')
    value = ...
    pcur.execute(sql, values)
else:
    pcur.execute('RELEASE SAVEPOINT sp1')
Run Code Online (Sandbox Code Playgroud)