处理psycopg2中的错误 - 一个错误似乎创造了更多?

时间:2017-03-24 00:13:04

标签: python psycopg2

我使用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命令。

我想我一定不能正确处理错误。我喜欢我的脚本来打印错误,然后顺利地继续下一个命令。

我应该怎么做呢?

3 个答案:

答案 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:当前事务中止,命令被忽略,直到事务块结束

我要在数据库中插入一些数据时出现此错误。

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