尋常でないもふもふ

a software engineer blog

TypeORMの@CreateDateColumnの精度を0にする

TypeORM では RailsActiveRecord と同じようにプライマリキーの 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 に書いてあるやり方でデフォルト値も書き換える。