今回、罠にハマった問題
データベースがPostgreSQL、ORMにsequelizeを使った環境で、migrate機能を使ってテーブルを作成しました。
データの更新日時を記録したかったので、updated_atのカラムを追加したのですが、UPDATE文を発行してもupdated_atは更新されませんでした。
migration.js
updated_at: {
allowNull: false,
type: Sequelize.DATE,
defaultValue: Sequelize.literal('CURRENT_TIMESTAMP'),
onUpdate: Sequelize.literal('CURRENT_TIMESTAMP')
}
(onUpdateがあるので日時は自動更新されそうな雰囲気ですが)
原因
PostgreSQLには、データの変更時に日時を更新する機能が備わっていない為、Sequelizeのmigrationファイルで設定してもデータベースには何も反映されていないと考えられます。
解決策
SQLでUPDATE文を発行する際に、手動でupdate_atの更新を行いました。
CURRENT_TIMESTAMPで現在時刻が取得できます。
sample.sql
UPDATE users SET name = taro, updated_at = CURRENT_TIMESTAMP WHERE id = 1
PostgreSQLのトリガー機能を使って実装すると、データベース側で自動更新できるようですが、今回はアプリ側が発行するSQLで対処しました。