繁体   English   中英

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

[英]Python Psycopg error and connection handling (v MySQLdb)

有没有办法让 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 为您执行 escaping,方法是将参数传递给 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/阅读有关它的更多信息

还可以查看专门为多次执行同一语句而设计的 method.executemany() 。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM