【问题标题】:Inserting field which is both PrimaryKey and DEFAULT using gorm to MySQL使用gorm向MySQL插入既是PrimaryKey又是DEFAULT的字段
【发布时间】: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。

标签: mysql go go-gorm


【解决方案1】:

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

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

原因是,在 Go 中,数据类型的值为零,spec 和好读 here

对您而言,可能的方法是使用适当的gorm callbacks 在数据库交互之前或之后设置或修改结构字段。

【讨论】:

    猜你喜欢
    • 2012-02-10
    • 1970-01-01
    • 2016-10-19
    • 2017-07-09
    • 1970-01-01
    • 1970-01-01
    • 2010-11-14
    • 2021-12-20
    • 1970-01-01
    相关资源
    最近更新 更多