Gorm, как объявить поле unix timestamp mills, которое не обновляется автоматически

У нас есть поле метки времени в таблице базы данных, оно должно обновляться только при возникновении бизнес-события, а не при создании/каждом обновлении.

Примеры автоматического обновления приведены по адресу 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, а затем попытаться заполнить правильное значение вручную.

Есть еще варианты, более удобные/автоматизированные?

Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
API ввода вопросов - это полезный инструмент для интеграции моделей машинного обучения, таких как ChatGPT, в приложения, требующие обработки...
1
0
85
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Как я хорошо знаю, вы можете создать собственный тип, который встраивает 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 будет автоматически обрабатывать данные о конверсиях всякий раз, когда вы запрашиваете или сохраняете записи.

Извините за мой плохой английский, надеюсь, это поможет

Другие вопросы по теме