web-dev-qa-db-ja.com

SequelizeJSを使用した外部キ​​ーを使用した移行の記述

背景

NodeJSの一般的なORMである SequelizeJS を使用してプロジェクトを構築しています。スキーマを設計するとき、2つの戦術があるように見えます:

  1. モデルコードを作成し、.sync()関数を使用して、モデルのテーブルを自動的に生成します。
  2. モデルコードを作成し、 QueryInterface および mzug を使用して 手動移行 を記述します。

私の理解では、#1はラピッドプロトタイピングには適していますが、#2は、時間の経過とともに進化し、運用データが移行に耐えられる必要があるプロジェクトのベストプラクティスです。

この質問は戦術#2に関係しています。

質問

私のテーブルには、外部キーを通じて反映される必要がある関係があります。

  • Sequelize QueryInterfaceを介して相互に外部キー関係を持つテーブルを作成するにはどうすればよいですか?

  • Sequelizeにはどの列とヘルパーテーブルが必要ですか?たとえば、createdAtやupdatedAtなどの特定の列が予想されるようです。

23
slifty

私は別のより手動の代替を提供したいので、手動の移行とqueryInterfaceを使用しているときに次の問題に遭遇しました:移行フォルダに2つのファイルがありました

migrations/create-project.js
migrations/create-projectType.js

projectには列projectTypeIdが含まれていたため、projectTypeを参照していましたが、ファイルの順序が原因でまだ作成されておらず、エラーが発生していました。

両方のテーブルを作成した後、外部キー制約を追加して解決しました。私の場合、create-projectType.js

queryInterface.createTable('project_type', {
  // table attributes ...
})
.then(() => queryInterface.addConstraint('project', ['projectTypeId'], {
  type: 'FOREIGN KEY',
  name: 'FK_projectType_project', // useful if using queryInterface.removeConstraint
  references: {
    table: 'project_type',
    field: 'id',
  },
  onDelete: 'no action',
  onUpdate: 'no action',
}))
5
galki