【发布时间】:2021-05-01 23:20:38
【问题描述】:
我在将 gorm 与具有整数属性的自定义类型一起使用时遇到了麻烦。 Gorm 倾向于为我将整数值转换为字符串。有两个不同的问题:
问题 1:
我有一个自定义类型定义如下:
type ClientType uint8
const (
USER ClientType = iota
SERVER
)
func (t ClientType) String() string {
return [...]string{"User", "Service"}[t]
然后我有一个 Client 的 ORM 结构,定义如下:
type Client struct {
ClientID uint64 `gorm:"primaryKey"`
UserID uint64
ClientType ClientType
CreatedAt time.Time
}
调用db.Create(&client) 时,gorm 会自动调用ClientType 上的String() 方法,并导致MySQL 中的数据类型不匹配,我打算将ClientType 存储在名为TINYINT 的TINYINT 列中。
问题 2:
所以我想如果我无法弄清楚如何覆盖String() 方法的自动调用,我只是将方法重命名为ToString() 并在需要时调用它。现在 gorm 不能再调用它,而是将整数值转换为数字字符串。所以USER,即0,现在将在生成的SQL语句中变为'0',而SERVER将变为'1',尽管MySQL能够将字符串转换回整数。
我仍然想知道我做错了什么让 gorm 认为我想要这些转换。
- 有没有办法覆盖
String()的调用,所以我仍然可以按常规命名方法? - 是使用
uint8使gorm 将int 转换为字符串,因为使用uint64 的其他数值(ClientID 和UserID)不受此问题的影响?是不是某种数据库模式缓存让 gorm 记住了 client_type 曾经是ENUM('User', 'Service')列的旧模式?
【问题讨论】:
标签: mysql go go-gorm uint tinyint