【发布时间】:2019-11-14 19:39:19
【问题描述】:
情况
- 我正在使用 Sequelize (v5.8.9)
upsert方法插入/更新记录 在具有唯一索引的表中。 - 我使用的是 Postgres 11,每个表都有
createdAt、createdBy、updatedAt和updatedBy字段。
问题
当我在表中插入一条记录时,Sequelize 会生成如下 SQL:
CREATE OR REPLACE FUNCTION pg_temp.sequelize_upsert
(OUT created boolean, OUT primary_key text) AS $func$
BEGIN INSERT INTO "table1" ("name","created_by","updated_by","created_at","updated_at")
VALUES (...) RETURNING "id" INTO primary_key; created := true;
EXCEPTION WHEN unique_violation THEN
UPDATE "table1" SET ...,"created_by"='user1',"updated_by"='user1',"updated_at"='2019-07-03 23:45:05.872 +00:00'
WHERE ("id" IS NULL OR "name" = '...')
RETURNING "tag_id" INTO primary_key; created := false;
END; $func$ LANGUAGE plpgsql;
SELECT * FROM pg_temp.sequelize_upsert();
我们可以看到,Sequelize 在记录已经存在时更新 created_by 字段(unique_violation)。
我找不到可以将 created_by 从更新中排除的解决方案或解决方法。我也喜欢坚持upsert,因为它比通过选择检查存在然后插入或更新更有效。任何建议表示赞赏。
我知道我可以指定fields 参数,但按照doc:
The fields to insert / update. Defaults to all changed fields
但在我的情况下,如果 upsert 的插入成功,我确实需要插入 created_by 字段。
我也在考虑在 Sequelize 中提出一个功能请求,以便在模型定义中我可以注册一个应该从所有更新(实例保存、Model.update、upsert 等)中排除的字段列表,而不仅仅是@987654332 @。
【问题讨论】:
标签: sequelize.js