node.js - 使用先前数据的条件对 upsert 进行 Sequelize

标签 node.js sequelize.js

我有一个接受 RESTful 风格请求的服务器。对于某类对象的 PUT,我想插入带有请求正文数据的新记录,或者更新以前的记录。为此,我正在使用 Sequelize upsert。

app.put('/someModel/:id', (req, res, next) => {
  const data = JSON.parse(JSON.stringify(req.body));
  data.id = req.params.id;
  models.SomeModel.upsert(data).then(() => {
    return models.SomeModel.findByPk(req.params.id);
  }).then(res.send.bind(res)).catch(next);
});

更新时,我只想更新以前未更改的数据库记录。也就是说,如果客户端 A 获取一条记录,然后客户端 B 修改该记录,然后客户端 A 随后尝试更新它,则该请求应该会失败,因为客户端 B 在客户端 A 的获取和更新之间更新了该记录。 (在 HTTP 端,我使用的是 If-Unmodified-Since 请求 header 。)

基本上,我需要一种方法来:
UPDATE table
SET
  field1="value1",
  field2="value2"
WHERE
  id=1234 AND
  updatedAt="2019-04-16 17:41:10";

这样,如果记录先前已更新,则此查询不会修改数据。

如何使用 Sequelize upsert 生成这样的 SQL?

最佳答案

至少对于 MySql,这是无效的 - upsert 结果

insert into table (field1) values ('value1') on duplicate key update field1 = values(value1);

语法不允许 WHERE 子句。另一个 DBMS,也许?

使用原始 sql,您可以使用 IF 函数伪造它:
INSERT INTO table (field1) VALUES ('value1') ON DUPLICATE KEY UPDATE
  field1 = IF(updatedAt = "2019-04-16 17:41:10", values(field1), field1);

但它有点丑。

关于node.js - 使用先前数据的条件对 upsert 进行 Sequelize ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55736932/

相关文章:

mysql - 使用 passport+express+mysql+sequelize 进行用户注册

node.js - Mongoose findOneAndUpdate 嵌套文档

mysql - 如何在 Sequelize 中正确设置自定义 'through' 表?

node.js - 如何在 View 中一致地访问用户是否经过身份验证

javascript - Node session 未正确保存

mysql - 使用 sequelizejs 进行自定义查询

sequelize.js - 我得到的这个 "defineCall is not a function"错误是什么?

node.js - 如何保存数组?

javascript - 当 Ajax 使用长轮询时,如何更新 AngularJS 中的模型?

javascript - 多行插入的嵌套数组正在使用 sequelize nodejs 进行字符串化