从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()