如何仅回退psycopg2.execute_values或execute_many上的失败条目?

psycopg2.IntegrityError进行批量插入时,除psycopg2.execute_values之外,基本上与我无关。如果触发异常(由于我的主键重复),我将rollback()连接。

但是,我仍然希望插入没有触发异常的行。我目前的处理计划是(在例外情况下)只是为了再次遍历for循环中的所有值和单独的insert语句,因此将所有插入除该行之外的行中。

这是效率极低的afaik。我不仅要重新插入所有可接受的行,而且还必须以一种极其低效的方式进行处理。

Q:

1:是否有一种方法可以在psycopg2.execute_values中更好地处理此异常,以便我仍然可以提交所有接受的值,并回滚失败的行?

2:如果不是,除了遍历数据结构并逐行插入每行之外,还有没有更有效的选择来进行批量插入(某些行可能失败)?

提供一些有关代码外观的上下文:

qry = """
        INSERT INTO delivery_pref_history ('val1,val2)
        VALUES %s
    """

conn,cur = my_pg_connect_function()

try:
    execute_values(cur,qry,[(val1,val2) for val1,val2 in zip(df_column1,df_column2)])

except psycopg2.IntegrityError:
    conn.rollback()
    logging.warning('Found duplicate primary key,rolling back')

   # Attempt inserts individually
   # New code,for loop over dataframe to insert individually

else:
    conn.commit()
lichenghd 回答:如何仅回退psycopg2.execute_values或execute_many上的失败条目?

如果您使用的是Postgres 9.5或更高版本,则可以使用ON CONFLICT语句跳过这些行:

INSERT INTO delivery_pref_history (val1,val2)
VALUES %s
ON CONFLICT DO NOTHING
本文链接:https://www.f2er.com/3100279.html

大家都在问