我在将 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 会自动调用String()
on 方法ClientType
,并导致 MySQL 中的数据类型不匹配,我打算将其存储ClientType
在TINYINT
名为client_type
.
问题2:
所以我想如果我无法弄清楚如何覆盖方法的自动调用String()
,我只是将方法重命名为ToString()
并在需要时调用它。现在 gorm 不能再调用它,而是将整数值转换为数字字符串。所以USER
,0
现在将'0'
在生成的 SQL 语句中变为 ,并且SERVER
将变为'1'
,尽管 MySQL 能够将字符串转换回整数。
我仍然想知道我做错了什么让 gorm 认为我想要这些转换。
- 有没有办法覆盖的调用
String()
,所以我仍然可以按照惯例命名该方法? - 是否使用
uint8
gorm 将 int 转换为字符串,因为使用 uint64 的其他数值(ClientID 和 UserID)不受该问题的影响?是不是某种数据库模式的缓存让 gorm 记住了 client_type 曾经是ENUM('User', 'Service')
列的旧模式?