【Prisma】PostgresでTimezoneを付与して安心する

こんにちは、フリーランスエンジニアの太田雅昭です。

PrismaのDateTimeのデフォルト挙動

PrismaはDateTime型を使用できます。以下のような具合です。

expiresAt DateTime  
createdAt DateTime  @default(now())
updatedAt DateTime? @updatedAt

これをPostgreSQLにmigrateすると、以下のフィールドになります。

timestamp without timezone

この状態でPrismaクライアントを使用してデータを挿入すると、タイムゾーンなしのUTCに変換されて保存されます。そのためwhereなどで検索する場合、Timezoneを考慮する必要があります。これはとても面倒で、バグの温床にもなりますし、余計なことに頭を使って疲れてしまいます。

Timezoneを付与する

そのためTimezoneを付与できれば、夜も安心して眠れるという話です。以下のようにすればTimezoneが付与されます。

expiresAt DateTime  @db.Timestamptz(3)
createdAt DateTime  @default(now()) @db.Timestamptz(3)
updatedAt DateTime? @updatedAt @db.Timestamptz(3)

ここで(3)となっているのは精度です。指定しない場合は、デフォルトの精度が使用されるようです。このTimestamptzを指定することで、PostgreSQLでは以下のフィールドになります。

timestamp with timezone

これで大丈夫です。なおこれをmigrateすると、dbデータ時刻があらぬ値になり、整合性が失われるため注意が必要です。正確に検証はしていないのですが、どうやらローカル時間に変更した上で、さらにそれをUTCとして扱うような形になっているようです。

小話

夜遅くなると薬局が閉まってるので、酒はコンビニで買うしか無いのはお財布が痛いですね。ただコンビニも薬局には無い製品があったりするので、たまにはいいのですが。