我在将 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(),所以我仍然可以按照惯例命名该方法? - 是否使用
uint8gorm 将 int 转换为字符串,因为使用 uint64 的其他数值(ClientID 和 UserID)不受该问题的影响?是不是某种数据库模式的缓存让 gorm 记住了 client_type 曾经是ENUM('User', 'Service')列的旧模式?