Вставка поля PrimaryKey и DEFAULT с использованием gorm в MySQL

Я хочу иметь таблицу, первичный ключ которой представляет собой автоматически сгенерированную метку времени (я знаю, что это, как правило, не лучшая идея, но в моем случае это нормально), и в ней есть другое строковое поле. Вот структура данных, которую я использую:

type GlobalDefault struct {
    Timestamp       time.Time           `gorm:"primary_key" sql:"DEFAULT:current_timestamp"`
    Version         string              `sql:"not null"`
}

Когда я использую эту структуру данных с AutoMigrate, я действительно получаю таблицу с меткой времени в качестве первичного ключа, и я даже могу запустить insert into global_defaults (version) VALUES ('1.5.3');, и новая строка будет вставлена ​​с автоматически созданной меткой времени.

Моя проблема в том, что я не могу вставлять записи в эту таблицу с помощью gorm. Я использую следующую функцию:

func (repository *AgentRepository)SetGlobalDefault(version string) error {
    gd := GlobalDefault{ Version:version }
    return repository.connection.Create(&gd).Error
}

И когда я его вызываю, я получаю следующую ошибку:

Полученная непредвиденная ошибка не может преобразовать аргумент поля Timestamp из int64 во время.

Если я укажу метку времени явно, это сработает. Я предполагаю, что у него проблема со временем по умолчанию ('0001-01-01 00:00:00 +0000 UTC'), которое создается, когда я не указываю его точно.

Это можно обойти?


person Dina    schedule 11.07.2017    source источник
comment
Мой совет не использовать метку времени в качестве первичного ключа в MySQL. Его уникальность не может быть гарантирована, это может вызвать у вас проблемы в MySQL. ; потому что временные метки хранятся с точностью до 1 секунды. Используйте BIGINT для первичного ключа и добавьте индекс в столбец Timestamp.   -  person jeevatkm    schedule 12.07.2017
comment
Я знаю, и я написал это в своем вопросе. Но я сосредоточен на понимании того, как использовать горм. Если я знаю, как создать такую ​​схему с помощью SQL, я хочу понять, как это сделать с помощью gorm.   -  person Dina    schedule 13.07.2017


Ответы (1)


После взаимодействия с комментариями, составление этого ответа.

Я предполагаю, что у него проблема со временем по умолчанию ('0001-01-01 00:00:00 +0000 UTC'), которое создается, когда я не указываю его точно.

Причина в том, что в Go тип данных имеет нулевое значение, spec и хорошее чтение здесь.

Для вас возможный способ - использовать соответствующие обратные вызовы gorm для установки или изменения полей структуры до или после взаимодействия с базой данных.

person jeevatkm    schedule 13.07.2017