我正在尝试使用SqlAlchemy和Postgres执行批量upsert,其中所有要插入的行都会收到 唯一值集 ,以便在有冲突。
我更喜欢这样做 而没有for循环 ,所以我只是整体执行一个SQL语句。有没有办法实现这个目标?
这是我现在拥有的。使用.on_update_do_nothing
方法时,此方法可以正常工作。我想知道如何正确传递每组值,以便在发生冲突时使用适当的信息更新每条记录而不是通用值。据我所知,尝试类似问题答案中建议的excluded
数据无法解决此问题,因为set_
需要值列表,而不是列表。
def bulkUpsert(self, items, unique_fields):
"""
Either inserts items into the table of supplied schema or does nothing.
Requires items to be mapped prior to being passed to this method.
"""
try:
statement = postgresql \
.insert(self.SCHEMA.__table__) \
.values(items) \
.on_conflict_do_update(
index_elements = unique_fields,
set_ = What to put here?
)
self.SESSION.execute(statement)
self.SESSION.commit()
except SQLAlchemyError as err:
print("Error with bulk insert: %s" % (err))
目前,items
参数是一个词典列表,可以按预期工作