在Sequelize迁移中承诺链接 - 关系不存在

时间:2016-07-11 09:51:02

标签: sequelize.js sequelize-cli umzug

这个简单的测试代码:

return queryInterface.createTable('tadam', {id: Sequelize.INTEGER, humus: Sequelize.STRING(255)})
      .then(queryInterface.sequelize.query('ALTER TABLE tadam ADD PRIMARY KEY (id)'));

返回以下错误:

Unhandled rejection SequelizeDatabaseError: relation "tadam" does not exist

现在,据我所知,当第二个承诺(关于改变表格)被执行时,该表尚未创建。

这可能不是因为迁移中的所有查询都是一次执行的,因为我有,f.e。这个测试迁移:

return queryInterface.sequelize.query('ALTER TABLE tadam DROP CONSTRAINT tadam_pkey')
  .then(queryInterface.removeIndex('tadam', 'tadam_pkey'));

它工作正常。

那么,任何人都可以解释为什么第一个不起作用以及如何实现它,以便创建表+添加PK可以从一次迁移中执行?

1 个答案:

答案 0 :(得分:7)

链接需要串行执行的承诺时,这是一个常见的错误。您将queryInterface.sequelize.query('ALTER TABLE tadam ADD PRIMARY KEY (id)')直接传递给then(),这意味着它会立即运行(即在创建表之前,因为第一个承诺尚未完成)。

您需要从函数返回promise,如下所示:

return queryInterface.createTable('tadam', {id: Sequelize.INTEGER, humus: Sequelize.STRING(255)})
  .then(function(results) {
    // results will be the result of the first query
    return queryInterface.sequelize.query('ALTER TABLE tadam ADD PRIMARY KEY (id)');
  });