【发布时间】:2017-07-11 12:57:56
【问题描述】:
我想要一个表,其主键是自动生成的时间戳(我知道这通常不是最好的主意,但在我的情况下没关系)并且它有另一个字符串字段。这是我使用的数据结构:
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 转换为 time.Time
如果我明确提供时间戳,它会起作用。我猜它的默认时间('0001-01-01 00:00:00 +0000 UTC')有问题,这是在我没有准确指定时创建的。
有没有办法解决这个问题?
【问题讨论】:
-
我的建议是不要在 MySQL 中使用 Timestamp 作为主键。它不能保证是唯一的,它可能会在 MySQL 中为你造成trouble;因为时间戳的存储精度仅为 1 秒。使用 BIGINT 作为主键并为 Timestamp 列添加索引。
-
我知道,我在我的问题中写了这个。但我的重点是了解如何使用 gorm。如果我知道如何使用 SQL 创建这样的模式,我想了解如何使用 gorm。