LoginSignup
5
3

More than 5 years have passed since last update.

gormでupdated_at(or created_at)な時刻を偽装する

Posted at

とりあえず2つ。

タイムスタンプ更新のコールバック関数を変更する

var stubNow time.Time
db.Callback().Update().Register("gorm:update_time_stamp_when_update", func(scope *gorm.Scope) {
    if _, ok := scope.Get("gorm:update_column"); !ok {
        scope.SetColumn("UpdatedAt", func() time.Time {
            return stubNow
        })
    }
})

gorm:update_time_stamp_when_update

UpdatedAtに値を代入する

コールバック関数は参照渡しの時のみ実行されるので、Sava(&model)を使用しない。

model = ModelA{
    ID:   100,
    name: "mary",
}
model.UpdatedAt = time.Now().AddDate(0, 0, 1) // Now + 1日にする.

db.Save(&model) // これはUpdatedAtはtime.Now()になってしまう。
db.Model(ModelA{}).Where("id = ?", model.ID).Update(model) // こっちで+1日になる。

実際の実行ではないので、コードが動かないと思いますが、こんな感じで実装すれば良いかと思います。

5
3
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
3