簡體   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