SQLの文字列カラムをPrismaのStringフィールドに変換する
VARCHAR、CHAR、TEXTなどのSQL文字列型がPrismaのStringフィールドにどのようにマッピングされるかを学びます。長さ制約、@db属性、ネイティブ型アノテーションを解説します。
詳細な説明
SQL文字列型からPrismaへ
SQLデータベースは、異なるストレージ特性を持つ複数の文字列型を提供しています。Prismaは単一のStringスカラー型を使用しますが、データベース固有のセマンティクスを保持するために@db属性を通じてネイティブ型アノテーションをサポートしています。
SQLの例
CREATE TABLE profiles (
id SERIAL PRIMARY KEY,
username VARCHAR(50) NOT NULL,
email VARCHAR(320) NOT NULL,
bio TEXT,
country_code CHAR(2) NOT NULL,
website VARCHAR(2048)
);
生成されるPrismaスキーマ
model Profile {
id Int @id @default(autoincrement())
username String @db.VarChar(50)
email String @db.VarChar(320)
bio String? @db.Text
countryCode String @db.Char(2)
website String? @db.VarChar(2048)
@@map("profiles")
}
型マッピング表
| SQL型 | Prisma型 | ネイティブアノテーション |
|---|---|---|
VARCHAR(n) |
String |
@db.VarChar(n) |
CHAR(n) |
String |
@db.Char(n) |
TEXT |
String |
@db.Text |
TINYTEXT |
String |
@db.TinyText(MySQL) |
MEDIUMTEXT |
String |
@db.MediumText(MySQL) |
LONGTEXT |
String |
@db.LongText(MySQL) |
CITEXT |
String |
@db.Citext(PostgreSQL拡張) |
ネイティブ型アノテーションが重要な理由
@dbアノテーションがなければ、PrismaはPostgreSQLではTEXT、MySQLではVARCHAR(191)をデフォルトにします。@db.VarChar(50)で元のSQL型を保持することで、prisma db pushやprisma migrateが意図したスキーマに正確に一致するDDLを生成することが保証されます。
長さバリデーション
Prisma自体はアプリケーションレベルで文字列の長さを強制しません — データベースの制約に依存します。ランタイムバリデーションが必要な場合は、PrismaとZodのようなライブラリを組み合わせてください:
const ProfileInput = z.object({
username: z.string().max(50),
countryCode: z.string().length(2),
});
大文字小文字を区別しない文字列
PostgreSQLのCITEXT拡張は、大文字小文字を区別しないテキストストレージを提供します。コンバーターはこれを検出し、@db.Citextアノテーションを追加します。メールアドレスやユーザー名のフィールドで大文字小文字が問題にならない場合に便利です。
カラム名マッピング
country_codeのようなsnake_caseのカラム名は、@map("country_code")ディレクティブ付きのcamelCaseのcountryCodeに変換されます。これにより、PrismaクライアントAPIはTypeScriptの慣用表現を保ちつつ、元のSQLカラム名が保持されます。
ユースケース
PostgreSQLデータベースに、特定の長さを持つVARCHAR、固定コード用のCHAR、長文コンテンツ用のTEXTなど、さまざまな文字列カラム型がある場合に、Prismaスキーマの生成時に正確なカラム型を保持する必要があります。