SQLの日付・タイムスタンプカラムをPrismaのDateTimeに変換する

SQL DATE、TIMESTAMP、TIMESTAMPTZ、TIMEカラムがPrismaのDateTimeフィールドにどのようにマッピングされるかを学びます。@default(now())、@updatedAt、ネイティブ型アノテーションを解説します。

Field Types

詳細な説明

日付と時刻のマッピング

SQLデータベースは、異なる精度とタイムゾーン対応を持つ複数の時間型を提供しています。Prismaは単一のDateTimeスカラー型を使用し、ネイティブアノテーションで基になるデータベース型を保持します。

SQLの例

CREATE TABLE events (
  id SERIAL PRIMARY KEY,
  title VARCHAR(255) NOT NULL,
  event_date DATE NOT NULL,
  starts_at TIMESTAMP NOT NULL,
  created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
  updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);

生成されるPrismaスキーマ

model Event {
  id        Int      @id @default(autoincrement())
  title     String
  eventDate DateTime @db.Date
  startsAt  DateTime @db.Timestamp()
  createdAt DateTime @default(now()) @db.Timestamptz()
  updatedAt DateTime @updatedAt @db.Timestamptz()

  @@map("events")
}

型マッピング表

SQL型 Prisma型 ネイティブアノテーション
DATE DateTime @db.Date
TIME DateTime @db.Time()
TIMESTAMP DateTime @db.Timestamp()
TIMESTAMPTZ DateTime @db.Timestamptz()
DATETIME(MySQL) DateTime @db.DateTime()

@updatedAt属性

Prismaは特別な@updatedAt属性を提供しており、Prismaクライアント経由でレコードが更新されるたびに自動的にフィールドを現在のタイムスタンプに設定します。コンバーターはupdated_atmodified_atlast_modifiedという名前のカラムを検出し、この属性を適用します。

@updatedAtはPrismaクライアントレベルで機能し、データベースレベルではないことに注意してください。直接SQLで更新する場合にもデータベースレベルの自動更新が必要な場合は、SQLトリガーも維持してください。

NOW()とデフォルト

SQLのDEFAULT NOW()DEFAULT CURRENT_TIMESTAMPDEFAULT GETDATE()はすべてPrismaの@default(now())にマッピングされます。これにより、レコード作成時に値が設定されます。

タイムゾーンのベストプラクティス

PostgreSQLでは常にTIMESTAMPよりTIMESTAMPTZを優先してください。コンバーターは@db.Timestamptz()@db.Timestamp()でこの区別を保持します。MySQLでは、同等のものはDATETIME(タイムゾーンなし)とTIMESTAMP(自動的にUTCに変換)です。

精度

一部のデータベースは小数秒の精度をサポートしています:

created_at TIMESTAMP(6) WITH TIME ZONE

Prismaでは@db.Timestamptz(6)にマッピングされ、マイクロ秒精度が保持されます。

日付のみのフィールド

時間コンポーネントのないカレンダー日付を表すフィールドには@db.Dateを使用してください — 誕生日、締切日、イベント日など。日付のみが重要な場合のタイムゾーンの混乱を避けることができます。

ユースケース

スケジュールアプリケーションで、イベント日にDATE、正確な時刻にTIMESTAMP、監査証跡にTIMESTAMPTZカラムがある場合に、コンバーターがタイムゾーン対応を保持し、変更追跡用の@updatedAtを自動生成します。

試してみる — SQL to Prisma Schema

フルツールを開く