2017-07-11 389 views
0

我想要一個主鍵是自動生成的時間戳的表(我知道這通常不是最好的主意,但在我的情況下它是可以的),它有另一個字符串字段這是我使用的數據結構:將使用gorm的PrimaryKey和DEFAULT字段插入到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 
} 

而當我把它稱爲我收到以下錯誤:

Received unexpected error could not convert argument of field Timestamp from int64 to time.Time

如果我明確地提供時間戳,它的工作原理。我猜測它的默認時間('0001-01-01 00:00:00 + 0000 UTC')是在我沒有完全指定時創建的。

有沒有辦法解決這個問題?

+0

我的建議是不要在MySQL中使用Timestamp作爲主鍵。它不能保證是唯一的,它可能會在MySQL中爲你造成[麻煩](https://bugs.mysql.com/bug.php?id=8523);因爲時間戳僅以1秒的精度進行存儲。 使用BIGINT作爲主鍵並將索引添加到Timestamp列。 – jeevatkm

+0

我知道了,我在我的問題中寫道。但我的重點是瞭解如何使用gorm。如果我知道如何使用SQL創建這樣的模式,我想了解如何使用gorm來完成。 – Dina

回答

0

經過評論互動,起草此答案。

I'm guessing that it has a problem with the default time ('0001-01-01 00:00:00 +0000 UTC') which is created when I don't specify it exactly.

的原因是,在Go數據類型具有零值,spec和良好的閱讀here

對於您來說,可能的方法是使用適當的gorm callbacks在數據庫交互之前或之後設置或修改結構字段。