有没有办法让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
答案 0 :(得分:2)
我认为您的代码目前看起来像这样:
l = "a very long ... text".split()
for e in l:
cursor.execute("INSERT INTO yourtable (yourcol) VALUES ('" + e + "')")
因此,请尝试将其更改为:
l = "a very long ... text".split()
for e in l:
cursor.execute("INSERT INTO yourtable (yourcol) VALUES (%s)", (e,))
所以永远不要忘记在参数列表中传递您的参数,然后您不必关心您的报价和内容,它也更安全。您可以在http://www.python.org/dev/peps/pep-0249/
了解更多相关信息还可以查看方法.executemany(),它专门用于多次执行相同的语句。
答案 1 :(得分:2)
首先,你应该让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将在您的下一个语句中回滚并启动一个新事务。