Prisma DateTimeフィールドからSQL TIMESTAMPとDATETIMEへの変換

Prisma DateTimeフィールドと@default(now())や@updatedAtがどのようにSQL TIMESTAMPまたはDATETIMEカラムとDEFAULT句に変換されるかを学びます。

Field Types

詳細な説明

DateTime型のマッピング

PrismaのDateTime型はダイアレクトに応じて異なるSQL型にマッピングされます。@default(now())@updatedAt属性は監査証跡にとって特に重要です。

デフォルトのマッピング

Prisma PostgreSQL MySQL SQLite
DateTime TIMESTAMP DATETIME TIMESTAMP
DateTime @default(now()) TIMESTAMP DEFAULT CURRENT_TIMESTAMP DATETIME DEFAULT CURRENT_TIMESTAMP TIMESTAMP DEFAULT CURRENT_TIMESTAMP
DateTime @updatedAt TIMESTAMP DEFAULT CURRENT_TIMESTAMP DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP TIMESTAMP DEFAULT CURRENT_TIMESTAMP

Prismaスキーマの例

model AuditLog {
  id        Int      @id @default(autoincrement())
  action    String
  details   String?
  createdAt DateTime @default(now()) @map("created_at")
  updatedAt DateTime @updatedAt @map("updated_at")

  @@map("audit_logs")
}

生成されるSQL(PostgreSQL)

CREATE TABLE audit_logs (
  id SERIAL PRIMARY KEY,
  action VARCHAR(255) NOT NULL,
  details VARCHAR(255),
  created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
);

生成されるSQL(MySQL)

CREATE TABLE audit_logs (
  id INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY,
  action VARCHAR(255) NOT NULL,
  details VARCHAR(255),
  created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

@updatedAtの違い

MySQLでは、@updatedAtON UPDATE CURRENT_TIMESTAMPを生成し、行が変更されるたびにカラムを自動更新するMySQLネイティブの機能です。PostgreSQLとSQLiteにはこの組み込みメカニズムがなく、Prismaがアプリケーションレベルで更新を処理するため、SQLにはDEFAULT CURRENT_TIMESTAMPのみが含まれます。

タイムゾーンの考慮事項

生成されるSQLはPostgreSQLではTIMESTAMPを使用し、値をUTCで保存します。タイムゾーン対応のタイムスタンプが必要な場合は、Prismaスキーマで@db.Timestamptzを使用します。MySQLのDATETIMEはタイムゾーン変換なしでリテラルの日時値を保存します。

ユースケース

コンプライアンス要件の厳しいアプリケーションの監査ログを設定しており、すべてのデータベースレコードにcreated_atとupdated_atタイムスタンプが必要で、SQLスキーマが組織のデータベース標準に合致するか確認する必要があります。

試してみる — Prisma to SQL Schema

フルツールを開く