English 中文(简体)
Python Psycopg错误和连接处理(v MySQLdb)
原标题:
  • 时间:2008-09-16 09:22:36
  •  标签:

有没有一种方法可以让psycopg和postgres在不必重新建立连接的情况下处理错误,比如MySQLdb?下面的注释版本适用于MySQLdb,注释使其适用于Psycopg2:

results = { felicitas : 3,  volumes : 8,  acillevs : 1,  mosaics : 13,  peratxe9 : 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将回滚并在您的下一条语句中启动一个新事务。

问题回答

我认为您的代码目前是这样的:

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()方法,它是专门为多次执行同一语句而设计的。





相关问题
热门标签