Python Psycopg错误和连接处理(v MySQLdb)

时间:2008-09-16 09:22:37

标签: python mysql psycopg2

有没有办法让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

2 个答案:

答案 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将在您的下一个语句中回滚并启动一个新事务。