SQLのENUMおよびCHECK制約をPrismaのenumに変換する

SQLのENUM型や固定値リストのCHECK制約がPrismaのenum宣言にどのように変換されるかを学びます。PostgreSQLのCREATE TYPE、MySQLのENUM、CHECKベースのenumを解説します。

Advanced Features

詳細な説明

SQL EnumからPrisma Enumへ

Prismaはenumキーワードによるenumのファーストクラスサポートを持っています。SQLデータベースは列挙型をさまざまな方法で表現しており、コンバーターは各バリアントを処理します。

PostgreSQL CREATE TYPE

CREATE TYPE user_role AS ENUM ('admin', 'editor', 'viewer');
CREATE TYPE post_status AS ENUM ('draft', 'published', 'archived');

CREATE TABLE users (
  id SERIAL PRIMARY KEY,
  name VARCHAR(255) NOT NULL,
  role user_role NOT NULL DEFAULT 'viewer'
);

CREATE TABLE posts (
  id SERIAL PRIMARY KEY,
  title VARCHAR(255) NOT NULL,
  status post_status NOT NULL DEFAULT 'draft',
  author_id INTEGER NOT NULL REFERENCES users(id)
);

生成されるPrismaスキーマ

enum UserRole {
  admin
  editor
  viewer
}

enum PostStatus {
  draft
  published
  archived
}

model User {
  id    Int      @id @default(autoincrement())
  name  String
  role  UserRole @default(admin)
  posts Post[]

  @@map("users")
}

model Post {
  id       Int        @id @default(autoincrement())
  title    String
  status   PostStatus @default(draft)
  authorId Int        @map("author_id")
  author   User       @relation(fields: [authorId], references: [id])

  @@map("posts")
}

MySQLのENUMカラム

MySQLはenumをインラインで定義します:

CREATE TABLE tickets (
  id INT AUTO_INCREMENT PRIMARY KEY,
  priority ENUM('low', 'medium', 'high', 'critical') NOT NULL DEFAULT 'medium'
);

コンバーターは値を抽出してPrismaのenumを作成します:

enum TicketPriority {
  low
  medium
  high
  critical
}

CHECK制約からEnumへ

CREATE TABLE orders (
  id SERIAL PRIMARY KEY,
  status VARCHAR(20) NOT NULL,
  CONSTRAINT chk_status CHECK (status IN ('pending', 'processing', 'shipped', 'delivered'))
);

コンバーターはCHECK制約のIN (...)リストを解析し、Prisma enumを生成します。

Enumの命名

SQL名 Prisma enum名
user_role UserRole(PascalCase)
post_status PostStatus
MySQLインラインENUM(priorityカラム) TicketPriority{Model}{Field}

値のマッピング

Prismaのenum値は有効な識別子である必要があります。SQL enum値に特殊文字が含まれるか数字で始まる場合、コンバーターは@mapを使用します:

enum HttpMethod {
  GET
  POST
  PUT
  DELETE @map("delete")
}

マイグレーションの考慮事項

Prisma enumに新しい値を追加すると、PostgreSQLではALTER TYPE ... ADD VALUEマイグレーションが生成されます。値の削除は直接サポートされていません — 新しいenumを作成してデータを移行する必要があります。将来の拡張性を考慮してenumを計画してください。

ユースケース

PostgreSQLデータベースがロールやステータスにCREATE TYPEを使用し、MySQLデータベースがインラインENUMカラムを使用している場合に、コンバーターが両方のパターンを正しいデフォルトとmodel参照を持つPrisma enum宣言に正規化します。

試してみる — SQL to Prisma Schema

フルツールを開く