Drizzle ORMにおける外部キー参照

SQL FOREIGN KEY制約とインラインREFERENCESをDrizzle ORMの.references()チェーンメソッドに変換し、型安全な外部キー定義を行う方法を学びます。

Relations

詳細な説明

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があります:

  1. .references()データベースレベルの外部キー制約を定義します。SQLコンバーターが生成するのはこれです。データベースに実際の外部キーを作成します。

  2. 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スキーマに変換する際にそれらのリレーションシップを保持し、データベースレベルでの参照整合性を維持したい場合。

試してみる — SQL to Drizzle Schema

フルツールを開く