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宣言に正規化します。