Drizzle ORMにおける外部キー参照
SQL FOREIGN KEY制約とインラインREFERENCESをDrizzle ORMの.references()チェーンメソッドに変換し、型安全な外部キー定義を行う方法を学びます。
詳細な説明
Drizzleにおける外部キー
Drizzleはカラムビルダーの.references()チェーンメソッドを通じて外部キーを処理します。このアプローチにより、外部キーの定義が適用されるカラムとインラインに保たれ、リレーションシップが即座に可視化されます。
インラインREFERENCES
SQL:
CREATE TABLE posts (
id SERIAL PRIMARY KEY,
title VARCHAR(255) NOT NULL,
author_id INTEGER NOT NULL REFERENCES users(id)
);
Drizzle:
export const posts = pgTable("posts", {
id: serial("id").primaryKey(),
title: varchar("title", { length: 255 }).notNull(),
authorId: integer("author_id").notNull().references(() => users.id),
});
テーブルレベルFOREIGN KEY
SQL:
CREATE TABLE comments (
id SERIAL PRIMARY KEY,
post_id INTEGER NOT NULL,
user_id INTEGER NOT NULL,
body TEXT NOT NULL,
FOREIGN KEY (post_id) REFERENCES posts(id),
FOREIGN KEY (user_id) REFERENCES users(id)
);
インラインとテーブルレベルの両方の外部キー制約は、同じDrizzle出力を生成します:対応するカラムの.references(() => table.column)チェーン。
重要:references()とrelations()の違い
Drizzleにはリレーションシップ用の2つの異なるAPIがあります:
.references()— データベースレベルの外部キー制約を定義します。SQLコンバーターが生成するのはこれです。データベースに実際の外部キーを作成します。relations()— DrizzleのリレーショナルクエリAPI用のアプリケーションレベルのリレーションシップを定義します。スキーマ定義とは別で、db.query.posts.findMany({ with: { author: true } })を有効にするために使用されます。
コンバーターはSQL外部キー制約から直接マッピングするため、.references()を生成します。クエリAPI用にrelations()定義をオプションで追加できます。
循環参照
2つのテーブルが互いに参照する場合、コンバーターは両方の.references()呼び出しを生成します。TypeScriptでは、循環参照にDrizzleのAnyPgColumn型を使用する必要がある場合があります:
import { AnyPgColumn } from "drizzle-orm/pg-core";
authorId: integer("author_id").references((): AnyPgColumn => users.id)
ユースケース
外部キー制約を持つリレーショナルデータベースがあり、Drizzle ORMスキーマに変換する際にそれらのリレーションシップを保持し、データベースレベルでの参照整合性を維持したい場合。