我使用Python 2和psycopg2 v2.6.2。我正在运行一系列psycopg2命令,并捕获任何错误:
for r in records:
county = r[0]
q = 'INSERT INTO allparcels(county, geom) '
q += "SELECT %s, ST_Union(ST_Buffer(wkb_geometry, 0)) FROM parcel "
q += "WHERE county=%s"
print q % (county, county)
try:
cursor.execute(q, (county, county))
conn.commit()
except Exception, e:
print e
print e.pgerror
cursor.close()
conn.close()
这是针对前几个记录运行的,然后我快速连续地获得所有其余行的ERROR: current transaction is aborted, commands ignored until end of transaction block
。
奇怪的是,如果我使用其中一个后续命令并直接在我的数据库中运行它,它可以正常工作。所以我认为后来的错误与psycopg2和我的错误处理有关,而不是SQL命令。
我想我一定不能正确处理错误。我喜欢我的脚本来打印错误,然后顺利地继续下一个命令。
我应该怎么做呢?
答案 0 :(得分:6)
这里的问题如下:
try:
# it is this specific line that causes an error
cursor.execute(q, (county, county))
# this never happens, so the transaction is still open
conn.commit()
except Exception, e:
...
# you never issued a rollback on the transaction ... its still open
正如您所看到的,如果cursor.execute
失败,那么您既不会尝试提交事务也不会将其回滚。循环的下一次迭代将尝试在已经中止但未回滚的事务上执行SQL。
相反,你需要遵循这种模式
try:
cursor.execute(...)
except Exception, e:
conn.rollback()
else:
conn.commit()
答案 1 :(得分:0)
donkopotamus'答案非常好。它有一个问题,即它会回滚整个事务,如果您作为更大的事务块的一部分执行此查询,这肯定是不合需要的行为。如果此查询是较大事务块的一部分,请考虑使用保存点:
multResult res = mydb.getInfo();
答案 2 :(得分:0)
psycopg2.errors.InFailedSqlTransaction:当前事务中止,命令被忽略,直到事务块结束
我要在数据库中插入一些数据时出现此错误。
这可以通过 增加表中属性的大小 来解决。