У нас есть поле метки времени в таблице базы данных, оно должно обновляться только при возникновении бизнес-события, а не при создании/каждом обновлении.
Примеры автоматического обновления приведены по адресу https://stackoverflow.com/a/60941397/41284 , а также в официальной документации gorm по адресу https://gorm.io/docs/models.html#Creating- x2F-Updating-Time-x2F-Unix-Milli-x2F-Nano-Seconds-Tracking но я не смог найти способ просто объявить поле метки времени с сохранением времени эпохи Unix с точностью до миллисекунд. Я, конечно, могу просто объявить его как int64, а затем попытаться заполнить правильное значение вручную.
Есть еще варианты, более удобные/автоматизированные?
Как я хорошо знаю, вы можете создать собственный тип, который встраивает time.Time и переопределяет его методы Scan и Value для обработки преобразования между представлением базы данных (int64) и представлением Go (time.Time).
Вот как вы можете определить собственный тип для поля метки времени Unix:
import (
"database/sql/driver"
"time"
)
// Define custom type to represent Unix timestamp in milliseconds
type UnixTimestamp struct {
time.Time
}
// Scan converts the database field to UnixTimestamp type
func (u *UnixTimestamp) Scan(value interface{}) error {
if value == nil {
return nil
}
unixTime := value.(int64) / 1000 // value is in ms
u.Time = time.Unix(unixTime, 0)
return nil
}
// Value converts UnixTimestamp type to a value that can be stored in the database
func (u UnixTimestamp) Value() (driver.Value, error) {
if u.IsZero() {
return nil, nil
}
return u.UnixNano() / int64(time.Millisecond), nil
}
Затем в вашей модели GORM вы можете использовать этот пользовательский тип для поля метки времени:
type YourModel struct {
ID uint `gorm:"primaryKey"`
Timestamp UnixTimestamp
// ...
}
gorm будет автоматически обрабатывать данные о конверсиях всякий раз, когда вы запрашиваете или сохраняете записи.
Извините за мой плохой английский, надеюсь, это поможет