Drizzle ORMにおける多対多リレーション
SQLの多対多ジャンクションテーブル(複合主キー付き)をDrizzle ORMスキーマ定義に変換。primaryKey制約とreferencesを使用します。
Relations
詳細な説明
Drizzleにおける多対多テーブル
SQLでの多対多リレーションシップは、関連する両方のテーブルへの外部キーを持つジャンクションテーブル(結合テーブルまたはブリッジテーブルとも呼ばれる)を使用します。コンバーターは、複合主キーと参照を持つDrizzleテーブルを生成してこれを処理します。
SQLの例
CREATE TABLE students (
id SERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL
);
CREATE TABLE courses (
id SERIAL PRIMARY KEY,
title VARCHAR(200) NOT NULL
);
CREATE TABLE enrollments (
student_id INTEGER NOT NULL REFERENCES students(id),
course_id INTEGER NOT NULL REFERENCES courses(id),
enrolled_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (student_id, course_id)
);
生成されるDrizzleスキーマ
import { integer, pgTable, primaryKey, serial, timestamp, varchar } from "drizzle-orm/pg-core";
import { sql } from "drizzle-orm";
export const students = pgTable("students", {
id: serial("id").primaryKey(),
name: varchar("name", { length: 100 }).notNull(),
});
export const courses = pgTable("courses", {
id: serial("id").primaryKey(),
title: varchar("title", { length: 200 }).notNull(),
});
export const enrollments = pgTable("enrollments", {
studentId: integer("student_id").notNull().references(() => students.id),
courseId: integer("course_id").notNull().references(() => courses.id),
enrolledAt: timestamp("enrolled_at").default(sql`CURRENT_TIMESTAMP`),
}, (table) => [
primaryKey({ columns: [table.studentId, table.courseId] }),
]);
キーポイント
複合主キー:
PRIMARY KEY (student_id, course_id)はテーブルの第3引数(制約コールバック)のprimaryKey()制約になります。primaryKey関数はダイアレクトモジュールからインポートする必要があります。外部キー: 両方の外部キーカラムは、それぞれの親テーブルを指す
.references()チェーンを取得します。個別の
.primaryKey()なし: 複合主キーが存在する場合、個々のカラムは.primaryKey()チェーンを取得しません。代わりに複合制約が使用されます。追加カラム: ジャンクションテーブルには
enrolled_atやroleのような追加カラムがあることが多いです。これらはキーカラムと一緒に通常通り処理されます。
Relations APIの追加
DrizzleのリレーショナルクエリAPIを多対多テーブルで使用するには、別のrelations()定義を追加します。これはSQLコンバーターが生成する範囲を超えていますが、変換後の推奨される次のステップです。
ユースケース
ジャンクションテーブルを通じて実装された多対多リレーションシップを持つデータベースがあり、複合主キーと外部キー参照を保持しながらDrizzle ORMに変換する必要がある場合。