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)
);
コンバーターは以下を生成します:
- カラム定義の
referencesプロパティ 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アソシエーションが生成される場合。