SqlAlchemy使用唯一的`set_`值批量upsert(Postgres)

时间:2018-03-12 22:12:19

标签: python postgresql sqlalchemy

我正在尝试使用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参数是一个词典列表,可以按预期工作

0 个答案:

没有答案