jde*_*son 18 python sql postgresql psycopg2
使用Python 2.7和
在[150]中:psycopg2.版本 [150]:'2.4.2(dt dec pq3 ext)'
我有一个简单的python脚本来处理事务并将数据写入数据库.偶尔会有一个违反我的主键的插入内容.这很好,我只是想让它忽略那条记录并继续它的快乐方式.我遇到的问题是psycopg2主键错误是在错误失败后中止整个事务块和所有插入.这是一个示例错误
ERROR: duplicate key value violates unique constraint "encounter_id_pkey"
DETAIL: Key (encounter_id)=(9012235) already exists.
Run Code Online (Sandbox Code Playgroud)
这是在下一个插入.不违反.
Inserting: 0163168~9024065
ERROR: current transaction is aborted, commands ignored until end of transaction block
Run Code Online (Sandbox Code Playgroud)
每次插入都会重复第二个错误.这是一个简化的循环.我正在循环一个pandas数据框,但它可能是任何循环.
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()
Run Code Online (Sandbox Code Playgroud)
同样,基本思想是优雅地处理错误.在皇家海军纳尔逊海军上将的格言:"该死的演习直接对他们说".或者在我们的情况下,该错误直接对他们说."我想通过在每个插件上打开一个光标我将重置事务块.我不想因为主键错误而重置连接.是有什么我不知道的吗?
先谢谢你的时间.
约翰
lig*_*lig 23
您应该在出错时回滚事务.
我try..except..else在下面的代码中添加了一个结构,以显示异常将发生的确切位置.
try:
cur = conn.cursor()
try:
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() })
except psycopg2.IntegrityError:
conn.rollback()
else:
conn.commit()
cur.close()
except Exception , e:
print 'ERROR:', e[0]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9888 次 |
| 最近记录: |