sqlite Peewee - Insert Many - On Conflict -在冲突时保留指定字段的正确查询结构?

mznpcxlj  于 2022-12-13  发布在  SQLite
关注(0)|答案(1)|浏览(256)

我对peewee insert_many on_conflict查询的行为感到困惑。虽然我认为我已经指定保留'created_at'列并在冲突时更新'updated_at'列,但实际情况正好相反。
查看数据库时,'created_at'比'updated_at'新。我查看了on_conflict的文档。方言是SQLite。此查询有什么问题?

query = (
            CA.insert_many(data)
            .on_conflict(
                conflict_target=[CA.loc_id,],
                preserve=(
                    CA.score,
                    CA.tags,
                    CA.process_at,
                    CA.created_at,
                    CA.deleted_at,
                )
            )
        ).execute()

编辑

根据@coleifer的回答(谢谢你的快速回复),我误解了“保留”的意思,以为它是指保留数据库中的列,而不是传入的数据。
为了限定我最初的问题,我们的目标是定义保持不变的列,特别是当数据库中保持不变的列很少而列很多时。EXCLUDED似乎允许这样做?我希望我有更多的例子。

50few1ms

50few1ms1#

您不希望对created_at执行preserve操作(这将保留您要插入的新值)。Preserve表示“使用我们要插入的值”。
因此,您只需要preserve您希望更新的字段:

query = (CA.insert_many(data)
     .on_conflict(
          conflict_target=[CA.loc_id,],
          preserve=(
              CA.score,
              CA.tags,
              CA.process_at,
              CA.updated_at,
          )
        )
    ).execute()

相关问题