Python 处理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

我将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 % (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:当前事务被中止,在事务块结束之前忽略命令

当我要在数据库中插入一些数据时,出现了这个错误

这可以通过增加表中属性的大小来解决