psycopg2忽略多行插入上的重复键冲突

时间:2016-12-05 20:51:11

标签: python postgresql bulkinsert psycopg2

我正在执行以下代码,但是,偶尔会发生重复的密钥违规,并且整个插入将停止。如何忽略此类错误并让查询执行有效条目?

代码:

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

为避免混淆,请在尝试后添加提交,但

除外

2 个答案:

答案 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?