SQLの文字列カラムをPrismaのStringフィールドに変換する

VARCHAR、CHAR、TEXTなどのSQL文字列型がPrismaのStringフィールドにどのようにマッピングされるかを学びます。長さ制約、@db属性、ネイティブ型アノテーションを解説します。

Field Types

詳細な説明

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 pushprisma 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スキーマの生成時に正確なカラム型を保持する必要があります。

試してみる — SQL to Prisma Schema

フルツールを開く