SQL FOREIGN KEYをSequelize belongsToアソシエーションに変換する

SQL FOREIGN KEY制約とインラインREFERENCES句がSequelizeのbelongsToアソシエーションにforeignKeyとtargetKeyオプション付きでどのように変換されるかを学びます。

Associations

詳細な説明

Sequelizeでの外部キーとbelongsTo

コンバーターがFOREIGN KEY制約またはインラインのREFERENCES句を検出すると、SequelizeのbelongsToアソシエーション宣言を生成します。これは最も一般的なリレーションシップパターンで、子テーブルが親テーブルを参照します。

インラインREFERENCES構文

CREATE TABLE comments (
  id SERIAL PRIMARY KEY,
  body TEXT NOT NULL,
  post_id INTEGER NOT NULL REFERENCES posts(id),
  user_id INTEGER NOT NULL REFERENCES users(id)
);

コンバーターは以下を生成します:

  1. カラム定義のreferencesプロパティ
  2. belongsToアソシエーションコメント
post_id: {
  type: DataTypes.INTEGER,
  allowNull: false,
  references: { model: 'posts', key: 'id' },
},
// Comment.belongsTo(Post, { foreignKey: 'post_id', targetKey: 'id' });

テーブルレベルのFOREIGN KEY

テーブルレベルの構文もサポートされています:

CREATE TABLE order_items (
  id SERIAL PRIMARY KEY,
  order_id INTEGER NOT NULL,
  product_id INTEGER NOT NULL,
  FOREIGN KEY (order_id) REFERENCES orders(id),
  FOREIGN KEY (product_id) REFERENCES products(id)
);

CONSTRAINT名付き外部キー

名前付き制約も同様にパースされます:

CONSTRAINT fk_order FOREIGN KEY (order_id) REFERENCES orders(id)

アソシエーション設定パターン

典型的なSequelizeプロジェクトでは、アソシエーションは別ファイルまたはassociate静的メソッドで設定します:

// models/index.jsまたは専用のアソシエーションファイル
Comment.belongsTo(Post, { foreignKey: 'post_id', targetKey: 'id' });
Comment.belongsTo(User, { foreignKey: 'user_id', targetKey: 'id' });

コンバーターはこれらをコメントとして生成するので、アソシエーション設定にコピーできます。カラム自体のreferencesプロパティは、sync()またはマイグレーション使用時にデータベースレベルで外部キー制約を作成するようSequelizeに指示します。

ユースケース

コメントが投稿とユーザーの両方に属するコメントシステムを構築しており、SQLスキーマの変換で両方の外部キーが正しく識別され、適切なbelongsToアソシエーションが生成される場合。

試してみる — SQL to Sequelize Model

フルツールを開く