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] }),
]);

キーポイント

  1. 複合主キー: PRIMARY KEY (student_id, course_id)はテーブルの第3引数(制約コールバック)のprimaryKey()制約になります。primaryKey関数はダイアレクトモジュールからインポートする必要があります。

  2. 外部キー: 両方の外部キーカラムは、それぞれの親テーブルを指す.references()チェーンを取得します。

  3. 個別の.primaryKey()なし: 複合主キーが存在する場合、個々のカラムは.primaryKey()チェーンを取得しません。代わりに複合制約が使用されます。

  4. 追加カラム: ジャンクションテーブルにはenrolled_atroleのような追加カラムがあることが多いです。これらはキーカラムと一緒に通常通り処理されます。

Relations APIの追加

DrizzleのリレーショナルクエリAPIを多対多テーブルで使用するには、別のrelations()定義を追加します。これはSQLコンバーターが生成する範囲を超えていますが、変換後の推奨される次のステップです。

ユースケース

ジャンクションテーブルを通じて実装された多対多リレーションシップを持つデータベースがあり、複合主キーと外部キー参照を保持しながらDrizzle ORMに変換する必要がある場合。

試してみる — SQL to Drizzle Schema

フルツールを開く