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では、@updatedAtがON 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スキーマが組織のデータベース標準に合致するか確認する必要があります。