TypeORMの@CreateDateColumnの精度を0にする
TypeORM では Rails の ActiveRecord と同じようにプライマリキーの id
カラムをオートインクリメントさせたり、INSERT 時に created_at
カラム、UPDATE 時に updated_at
カラムを自動更新したりできる。
Entity クラス
import {CreateDateColumn, Entity, PrimaryGeneratedColumn, UpdateDateColumn} from 'typeorm'; @Entity('samples') export class Sample { @PrimaryGeneratedColumn() id: number; @CreateDateColumn({name: 'created_at'}) createdAt: Date; @UpdateDateColumn({name: 'updated_at'}) updatedAt: Date; }
ActiveRecord との違い
ActiveRecord では DATETIME の精度がデフォルトの 0 となり、値としては 2018-01-01 00:00:00
のようになる。
Field | Type | Null | Key | Default | Extra |
---|---|---|---|---|---|
id | int(11) | NO | PRI | NULL | auto_increment |
created_at | datetime | NO | NULL | ||
updated_at | datetime | NO | NULL |
TypeORM は DATETIME の精度が 6 となり、値としては 2018-01-01 00:00:00.000000
のようにマイクロ秒まで扱う設定となる。
Field | Type | Null | Key | Default | Extra |
---|---|---|---|---|---|
id | int(11) | NO | PRI | NULL | auto_increment |
created_at | datetime(6) | NO | CURRENT_TIMESTAMP(6) | ||
updated_at | datetime(6) | NO | CURRENT_TIMESTAMP(6) |
精度を 0 にする
要件次第ではあるがマイクロ秒どころかミリ秒すらいらなかったので ActiveRecord と同じように精度 0 にしたい。
@CreateDateColumn({name: 'created_at', precision: 0, default: () => 'NOW()'}) createdAt: Date; @UpdateDateColumn({name: 'updated_at', precision: 0, default: () => 'NOW()'}) updatedAt: Date;
precision
で精度を 0 指定する。これだけだとデフォルト値が CURRENT_TIMESTAMP(6)
となってしまいエラーになるので、公式 FAQ に書いてあるやり方でデフォルト値も書き換える。