gpt4 book ai didi

python - Python/psycopg2 中的优雅主键错误处理

转载 作者:IT老高 更新时间:2023-10-28 21:02:06 25 4
gpt4 key购买 nike

使用 Python 2.7 和

在 [150] 中:psycopg2.版本Out[150]: '2.4.2 (dt dec pq3 ext)'

我有一个简单的 python 脚本来处理事务并将数据写入数据库。偶尔会有一个违反我的主键的插入。这很好,我只是希望它忽略该记录并继续愉快地前进。我遇到的问题是 psycopg2 主键错误正在中止整个事务 block ,并且错误后的所有插入都失败了。这是一个示例错误

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

每次插入都会重复第二个错误。这是一个简化的循环。我正在循环遍历 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()

同样,基本思想是优雅地处理错误。在皇家海军海军上将纳尔逊的格言中:“该死的演习直接针对他们”。或者在我们的例子中,该死的错误直接指向它们。”我想通过在每个插入上打开一个光标,我将重置事务 block 。我不想仅仅因为主键错误而不得不重置连接。是有什么我遗漏的吗?

感谢您抽出宝贵时间。

约翰

最佳答案

您应该在出错时回滚事务。

我在下面的代码中又添加了一个 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]

关于python - Python/psycopg2 中的优雅主键错误处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8497886/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com