为了账号安全,请及时绑定邮箱和手机立即绑定

如何防止 gorm 将自定义整数类型转换为字符串?

如何防止 gorm 将自定义整数类型转换为字符串?

Go
守着星空守着你 2022-08-01 18:47:00
在将 gorm 与具有整数属性的自定义类型一起使用时,我遇到了麻烦。Gorm倾向于为我将整数值转换为字符串。有两个不同的问题:问题 1:我有一个自定义类型,定义如下:type ClientType uint8const (    USER ClientType = iota    SERVER)func (t ClientType) String() string {    return [...]string{"User", "Service"}[t]然后我有一个ORM结构,定义如下:Clienttype Client struct {    ClientID uint64 `gorm:"primaryKey"`    UserID uint64    ClientType ClientType    CreatedAt time.Time}调用时,gorm 会自动调用 on 上的方法,并导致 MySQL 中的数据类型不匹配,我打算将其存储在名为 .db.Create(&client)String()ClientTypeClientTypeTINYINTclient_type问题 2:所以我想,如果我不知道如何重写方法的自动调用,我只需将方法重命名为并在需要时调用它。现在 gorm 不能再调用它了,而是将整数值转换为数字字符串。因此,现在,哪个是,将变成生成的SQL语句,并且将成为,尽管MySQL能够将字符串转换回整数。String()ToString()USER0'0'SERVER'1'我仍然想知道我做错了什么,让gorm认为我想要这些转换。有没有办法覆盖 的调用,所以我仍然可以按照惯例命名该方法?String()是不是使用 that made gorm 将 int 转换为字符串,因为使用 uint64 的其他数值(ClientID 和 UserID)不受此问题的影响?是某种数据库模式的缓存使gorm记住了旧的模式,其中client_type曾经是一列?uint8ENUM('User', 'Service')
查看完整描述

1 回答

?
哔哔one

TA贡献1854条经验 获得超8个赞

根据自定义类型的gorm,需要实现值和扫描。


您也可以尝试在结构中指定类型(将<TYPE>替换为列类型)。


type Client struct {

    ClientID   uint64 `gorm:"primaryKey"`

    UserID     uint8

    ClientType ClientType `gorm:"type:<TYPE>"`

    CreatedAt  time.Time

}

String() 似乎没有问题,因为它不是在创建期间调用的,而是仅在查找期间调用的。


使用 db.LogMode(true),它也在创建期间被调用,但这似乎是用于sql查询日志记录,而不是用于发送到DB。


关闭日志模式


    db.LogMode(false)

    fmt.Println("Creating")

    db.Create(&Client{ClientID: 9, UserID: 8, ClientType: USER, CreatedAt: time.Now()})

    fmt.Println("Created")


    fmt.Println("Finding")

    db.First(&client)

    fmt.Printf("Found %v\n", client)

输出


Creating

Created

Finding

String() called with 0

Found {9 8 User 2021-01-28 11:41:51.355633057 +0530 +0530}


开启登录模式


    db.LogMode(true)

    fmt.Println("Creating")

    db.Create(&Client{ClientID: 9, UserID: 8, ClientType: USER, CreatedAt: time.Now()})

    fmt.Println("Created")


    fmt.Println("Finding")

    db.First(&client)

    fmt.Printf("Found %v\n", client)

输出:


Creating

String() called with 0

[2021-01-28 11:39:30]  [0.95ms]  INSERT INTO "clients" ("client_id","user_id","client_type","created_at") VALUES (9,8,'User','2021-01-28 11:39:30')  

[1 rows affected or returned ] 

Created

Finding

[2021-01-28 11:39:30]  [1.49ms]  SELECT * FROM "clients"   LIMIT 1  

[1 rows affected or returned ] 

String() called with 0

Found {9 8 User 2021-01-28 11:42:31.245628274 +0530 +0530}


查看完整回答
反对 回复 2022-08-01
  • 1 回答
  • 0 关注
  • 159 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信