Sequelize涉及“最后插入行id”的特殊查询

时间:2016-05-02 19:08:01

标签: mysql sqlite sequelize.js

我有以下数据库结构(用SQLite方言表示):

self

现在我想在Sequelize.js中实现的内容类似于SQLite中的以下SQL查询:

CREATE TABLE `Clocks` (`_id` INTEGER PRIMARY KEY AUTOINCREMENT, `time` DATETIME);
CREATE TABLE `Operations`
(
    `_id` UUID NOT NULL PRIMARY KEY,
    `finished` TINYINT(1) NOT NULL DEFAULT 0,
    `launchedOn` BIGINT REFERENCES `Clocks` (`_id`) ON DELETE SET NULL ON UPDATE CASCADE,
    `finishedOn` BIGINT REFERENCES `Clocks` (`_id`) ON DELETE SET NULL ON UPDATE CASCADE
);

以下:

BEGIN TRANSACTION;
    INSERT INTO Clocks(time) VALUES (date('now'));
    INSERT INTO Operations(_id, finished, userId, launchedOn) VALUES ('00000000-0000-0000-0000-000000000001',  0, last_insert_rowid());
COMMIT;

我已经对Sequelize.js进行了一些调查,我已经了解了如何组织上述事务,但我不知道如何将last_insert_rowid()包含到插入项目列表中。顺便说一句,这个函数是SQLite特有的,是否有跨数据库替代它?

提前谢谢!

1 个答案:

答案 0 :(得分:1)

您可以尝试这些,您可以返回在插入时创建的结果对象,并在下一个查询中使用它。

第一个查询:

return sequelize.transaction(function (t) {
  return Clocks.sync().then(function(){
    return Clocks.create({
      time: Sequelize.fn('date', 'now')
    });
  }).then(function(clock){
    return Operations.sync().then(function(){
      return Operations.create({
        id: '00000000-0000-0000-0000-000000000001',
        finished: 0,
        launchedOn: clock.id 
      }, {transaction: t});
    });
  });
});

第二个查询:

return sequelize.transaction(function (t) {
  return Clocks.sync().then(function(){
        return Clocks.create({
            time: Sequelize.fn('date', 'now')
        });
      }).then(function(clock){
        return Operations.sync().then(function(){
            return Operations.update({
                    finished: 1,
                    finishedOn: clock.id 
                }, 
        {where: { id: '00000000-0000-0000-0000-000000000001'}},
        {transaction: t});
        });
      });
});

我很确定你可以在其他方言上做同样的事情。