使用gorm向MySQL插入PrimaryKey和DEFAULT字段

使用gorm向MySQL插入PrimaryKey和DEFAULT字段,mysql,go,go-gorm,Mysql,Go,Go Gorm,我希望有一个主键是自动生成的时间戳的表(我知道这通常不是最好的主意,但在我的例子中它是可以的),并且它有另一个字符串字段。这是我使用的数据结构: type GlobalDefault struct { Timestamp time.Time `gorm:"primary_key" sql:"DEFAULT:current_timestamp"` Version string `sql:"not null"`

我希望有一个主键是自动生成的时间戳的表(我知道这通常不是最好的主意,但在我的例子中它是可以的),并且它有另一个字符串字段。这是我使用的数据结构:

type GlobalDefault struct {
    Timestamp       time.Time           `gorm:"primary_key" sql:"DEFAULT:current_timestamp"`
    Version         string              `sql:"not null"`
}
当我将这个数据结构与AutoMigrate一起使用时,我确实得到了一个以时间戳为主键的表,我甚至可以运行
insert-into-global_defaults(version)值('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')有问题,该时间是在我没有准确指定它时创建的


有办法解决这个问题吗?

在评论互动之后,起草这个答案

我猜它的默认时间('0001-01-01 00:00:00+0000 UTC')有问题,该时间是在我没有准确指定它时创建的

原因是,in-Go数据类型具有零值和良好的读取能力


对于您来说,可能的方法是在数据库交互之前或之后使用适当的设置或修改struct字段。

我的建议是不要在MySQL中使用时间戳作为主键。它不能保证是唯一的,它可能会导致你在MySQL;因为时间戳的存储精度只有1秒。使用BIGINT作为主键,并将索引添加到Timestamp列。我知道,我在问题中写到了这一点。但我的重点是理解如何使用gorm。如果我知道如何使用SQL创建这样的模式,我想了解如何使用gorm。