我正在执行以下代码,但是,偶尔会发生重复的密钥违规,并且整个插入将停止。如何忽略此类错误并让查询执行有效条目?
代码:
query_data = ','.join(cur.mogrify('(%s,%s)', row) for row in data)
insert_q = "INSERT INTO <table> VALUES {0};".format(query_data)
try:
cur.execute(insert_q)
except psycopg2.Error:
self.logger.exception('Database error')
con.commit()
更新2:
我在下面发布了自己的答案,解决了这个问题。它在Postgres中使用了新的ON CONFLICT语法。
更新1:
有一个关于在except块内部提交的问题,但是,我发现的是,如果你不是所有其他插件都不会执行,则会发出以下错误:
ERROR: current transaction is aborted, commands ignored until end of transaction block
为避免混淆,请在尝试后添加提交,但
除外答案 0 :(得分:1)
当你在except块中提交时,通常整个脚本都会阻塞。
编辑,解释更详细:
try:
cur.execute(insert_q)
con.commit()
except psycopg2.Error:
self.logger.exception('Database error')
con.rollback()
答案 1 :(得分:0)
以下是工作代码(带有查询):
query_data = ','.join(cur.mogrify('(%s,%s)', row) for row in data)
insert_q = "INSERT INTO <table> VALUES {0} ON CONFLICT DO NOTHING;".format(query_data)
try:
cur.execute(insert_q)
except psycopg2.Error:
self.logger.exception('Database error')
con.commit()
点击此处了解详情:What happens with duplicates when inserting multiple rows?