情况
- 我正在使用semelize的(v5.8.9(
upsert
插入/更新记录的方法在带有唯一索引的表中。 - 我使用的是Postgres 11,每个表都有字段
createdAt
,createdBy
,updatedAt
和updatedBy
。
问题
当我在表中添加记录时,续集会生成这样的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();
正如我们可以看到的续集正在更新记录时的create_by字段(unique_violation(。
我找不到解决方案或解决方法,因此可以将创建的_BY从更新中排除。我还喜欢坚持使用upsert
,因为它比通过选择检查存在然后插入或更新更有效。任何建议都将不胜感激。
我知道我可以指定fields
参数,但是根据DOC:
The fields to insert / update. Defaults to all changed fields
但是,就我的插入成功而我确实需要插入created_by
字段。
我还在考虑在续集中提出功能请求,以便在模型定义中我可以注册一个字段列表,这些字段应从所有更新(实例保存,model.update,upsert等(中排除,而不仅仅是createdAt
。
在UPSERT方法中,您可以将对象作为第二个参数,带有 fields 键,以提供插入或更新的字段列表。
检查此文档:
http://docs.sequesselizejs.com/class/lib/model.js~model.html#static-method-upsert
db.model.upsert({
...yourData
},{
fields: [...NameOfFieldsToBeUpdated]
}).then(function(test){})