根据先前数据的条件来安排追加

时间:2019-04-17 22:44:34

标签: 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请求标头。)

基本上,我需要一种方法:

UPDATE table
SET
  field1="value1",
  field2="value2"
WHERE
  id=1234 AND
  updatedAt="2019-04-16 17:41:10";

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

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

1 个答案:

答案 0 :(得分:1)

至少对于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);

但这有点丑陋。