Python 处理psycopg2中的错误-一个错误似乎会产生更多错误?
我将Python2与psycopg2 v2.6.2一起使用。我正在运行一系列psycopg2命令,并捕获任何错误:Python 处理psycopg2中的错误-一个错误似乎会产生更多错误?,python,psycopg2,Python,Psycopg2,我将Python2与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 % (coun
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()
这对前两条记录运行,然后我得到错误:当前事务被中止,在所有其余行的事务块结束之前,命令被忽略
奇怪的是,如果我使用后面的一个命令并直接在数据库中运行它,它就可以正常工作。因此,我认为后面的错误与psycopg2和我的错误处理有关,而不是SQL命令
我想我一定没有正确处理这个错误。我希望我的脚本打印错误,然后继续平滑地执行下一个命令
我应该怎么做呢?这里的问题如下:
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()
donkopotamus的回答很好。它有一个问题,即它回滚整个事务,如果您将此查询作为更大事务块的一部分执行,那么这肯定是不受欢迎的行为。如果这个查询是更大事务块的一部分,请考虑使用保存点:
try:
cursor.execute("savepoint my_save_point")
cursor.execute(query)
except:
cursor.execute("rollback to savepoint my_save_point")
finally:
cursor.execute("release savepoint my_save_point")
psycopg2.errors.InFailedSqlTransaction:当前事务被中止,在事务块结束之前忽略命令
当我要在数据库中插入一些数据时,出现了这个错误
这可以通过增加表中属性的大小来解决