代码之家  ›  专栏  ›  技术社区  ›  unmounted

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

  •  2
  • unmounted  · 技术社区  · 16 年前

    有没有一种方法可以让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 回复  |  直到 14 年前
        1
  •  2
  •   fog    16 年前

    首先,您应该让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将回滚并在您的下一个语句中启动新事务。

        2
  •  2
  •   Mauli    16 年前

    我认为你的代码现在看起来像这样:

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