3

この簡単なテスト コード:

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

これで、2 番目の promise (テーブルの変更に関する) が実行されるまでに、テーブルがまだ作成されていないことがわかりました。

移行内のすべてのクエリが一度に実行されるため、このテスト移行が発生した可能性があります。

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

そしてそれはうまくいきます。

では、テーブルの作成とPKの追加を1回の移行で実行できるように、最初のものが機能しない理由と、それをどのように実装できるかを説明できますか?

4

1 に答える 1

7

これは、順番に実行する必要がある promise をチェーンするときによくある間違いです。queryInterface.sequelize.query('ALTER TABLE tadam ADD PRIMARY KEY (id)')つまり、すぐに実行されますthen()(つまり、最初の promise がまだ終了していないため、テーブルが作成される前)。

次のように、関数から 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)');
  });
于 2016-07-19T22:46:22.297 に答える