Python 2.7およびPython/psycopg2のグレースフルプライマリキーエラー処理
[150]:psycopg2。 バージョン アウト[150]:「2.4.2(12月のPQ3の内線DT」)
私は、トランザクションを処理する簡単なPythonスクリプトを持っているし、データベースにデータを書き込みます。時々、私の主キーに違反する挿入物があります。これは問題ありません。私はそのレコードを無視して、それをメリーに続けてほしいだけです。私が抱えている問題は、psycopg2の主キーエラーがトランザクションブロック全体を中止し、エラーが失敗した後にすべての挿入が行われてしまうことです。ここには例エラーがあります
ERROR: duplicate key value violates unique constraint "encounter_id_pkey"
DETAIL: Key (encounter_id)=(9012235) already exists.
これは次の挿入にあります。違反ではありません。
Inserting: 0163168~9024065
ERROR: current transaction is aborted, commands ignored until end of transaction block
2番目のエラーは、挿入するたびに繰り返されます。ここには単純化されたループがあります。私はパンダのデータフレームをループしていますが、それはどんなループでもかまいません。
conn = psycopg2.connect("dbname='XXXX' user='XXXXX' host='XXXX' password='XXXXX'")
cur = conn.cursor()
for i, val in df2.iteritems():
try:
cur = conn.cursor()
cur.execute("""insert into encounter_id_table (
encounter_id,current_date )
values
(%(create_date)s, %(encounter_id)s) ;""",
'encounter_id':i.split('~')[1],
'create_date': datetime.date.today() })
cur.commit()
cur.close()
except Exception , e:
print 'ERROR:', e[0]
cur.close()
conn.close()
また、基本的な考え方はエラーを正常に処理することです。海軍のネルソン提督の言葉によれば、「操縦はまっすぐに進む」私の場合、エラーはまっすぐに進みます。 "私は、トランザクションブロックをリセットするすべてのインサートのカーソルを開くことで考えました。プライマリキーエラーのために接続をリセットする必要はありません。そこに何か私はちょうど
。
ジョン
はほとんど答えです。しかし、ここでは接続オブジェクト(conn)のrollback()メソッドを呼び出す必要があります。カーソルはロールバックしないコミットのみを持ちます。ありがとう – jdennison
メソッドエラー。カーソルではなくコネクション上でコミットを呼び出さなければなりません。 – jdennison
私はコミットとロールバックが接続方法であると思っていました。誰かが私のコードを編集して修正するべきだと考えてください。悲しいことに、私はORMや非リレーショナルデータベースを使っているので、直接psycopgの使用に慣れていません。 – lig