Psycopg2在多行插入时忽略重复键违规。

5
我正在执行以下代码,但是偶尔会出现重复键违规并导致整个插入操作停止。如何忽略这样的错误并让查询对有效条目执行?

代码:

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

为了避免混淆,在try except之后添加了提交。

这不是在查询中执行的操作。这是在创建表时设置的内容(或者可以通过修改表来添加)。 - user554546
1
另外,为什么你要在except块内提交(commit)呢? - user554546
如果不这样做,随后的所有查询也都不会被执行。这只是代码的一个示例。 - c00der
好的,是啊,这就是不提交代码的意义所在。 - user554546
1个回答

5
以下是带查询的工作代码:
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()

点击此处了解更多关于当插入多行时遇到重复数据时会发生什么的信息。


多行更新的等效方法是什么? - Cassova
我如何捕捉所有存在冲突的条目,以便稍后对其采取行动? - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接