有没有办法让psycopg和postgres处理错误而不必像MySQLdb那样重新建立连接?下面的注释版本与MySQLdb一起使用,注释使其与Psycopg2一起使用:

results = {'felicitas': 3, 'volumes': 8, 'acillevs': 1, 'mosaics': 13, 'perat\xe9': 1, 'representative': 6....}
for item in sorted(results):
    try:
        cur.execute("""insert into resultstab values ('%s', %d)""" % (item, results[item]))
        print item, results[item]
#       conn.commit()
    except:
#       conn=psycopg2.connect(user='bvm', database='wdb', password='redacted')
#       cur=conn.cursor()
        print 'choked on', item
        continue

这一定会减慢速度,有谁能给我们一个建议来传递格式错误吗?很明显,上面的内容被撇号阻塞了,但是有没有一种方法可以让它忽略掉,而不需要像下面这样的东西,或者提交,重新连接等等?:
agreement 19
agreements 1
agrees 1
agrippa 9
choked on agrippa's
choked on agrippina

最佳答案

首先,您应该让psycopg通过将参数传递给execute()方法而不是使用“%”来为您进行转义。即:

cur.execute("insert into resultstab values (%s, %s)", (item, results[item]))

请注意,我们如何使用“%s”作为标记,即使对于非字符串值也是如此,并避免在查询中使用引号。psycopg会为我们做所有的报价。
然后,如果要忽略某些错误,只需回滚并继续。
try:
    cur.execute("SELECT this is an error")
except:
    conn.rollback()

这就是全部。psycopg将回滚并在下一条语句上启动新事务。

09-26 14:34