基本上,当通过psycopg2.execute_values
执行批插入时,除了psycopg2.IntegrityError
之外的I。如果异常被触发-在我的例子中是由于一个重复的主键-Irollback()
连接。你知道吗
但是,我仍然希望插入没有触发异常的行。我目前处理这个问题的计划是(在异常情况下)在for循环和个别insert语句中再次遍历所有值,因此除了被异常的行之外,所有值都被插入。你知道吗
这是非常低效的。我不仅必须重新插入所有可接受的行,而且必须以一种非常低效的方式进行。你知道吗
问题:
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()
如果您使用的是postgres 9.5或更新版本,则可以使用ON CONFLICT语句跳过这些行:
相关问题 更多 >
编程相关推荐