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

在将 gorm 与具有整数属性的自定义类型一起使用时,我遇到了麻烦。Gorm倾向于为我将整数值转换为字符串。有两个不同的问题:


问题 1:


我有一个自定义类型,定义如下:


type ClientType uint8


const (

    USER ClientType = iota

    SERVER

)


func (t ClientType) String() string {

    return [...]string{"User", "Service"}[t]

然后我有一个ORM结构,定义如下:Client


type 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认为我想要这些转换。

  1. 有没有办法覆盖 的调用,所以我仍然可以按照惯例命名该方法?String()

  2. 是不是使用 that made gorm 将 int 转换为字符串,因为使用 uint64 的其他数值(ClientID 和 UserID)不受此问题的影响?是某种数据库模式的缓存使gorm记住了旧的模式,其中client_type曾经是一列?uint8ENUM('User', 'Service')


守着星空守着你
浏览 160回答 1
1回答

哔哔one

根据自定义类型的gorm,需要实现值和扫描。您也可以尝试在结构中指定类型(将<TYPE>替换为列类型)。type Client struct {&nbsp; &nbsp; ClientID&nbsp; &nbsp;uint64 `gorm:"primaryKey"`&nbsp; &nbsp; UserID&nbsp; &nbsp; &nbsp;uint8&nbsp; &nbsp; ClientType ClientType `gorm:"type:<TYPE>"`&nbsp; &nbsp; CreatedAt&nbsp; time.Time}String() 似乎没有问题,因为它不是在创建期间调用的,而是仅在查找期间调用的。使用 db.LogMode(true),它也在创建期间被调用,但这似乎是用于sql查询日志记录,而不是用于发送到DB。关闭日志模式&nbsp; &nbsp; db.LogMode(false)&nbsp; &nbsp; fmt.Println("Creating")&nbsp; &nbsp; db.Create(&Client{ClientID: 9, UserID: 8, ClientType: USER, CreatedAt: time.Now()})&nbsp; &nbsp; fmt.Println("Created")&nbsp; &nbsp; fmt.Println("Finding")&nbsp; &nbsp; db.First(&client)&nbsp; &nbsp; fmt.Printf("Found %v\n", client)输出CreatingCreatedFindingString() called with 0Found {9 8 User 2021-01-28 11:41:51.355633057 +0530 +0530}开启登录模式&nbsp; &nbsp; db.LogMode(true)&nbsp; &nbsp; fmt.Println("Creating")&nbsp; &nbsp; db.Create(&Client{ClientID: 9, UserID: 8, ClientType: USER, CreatedAt: time.Now()})&nbsp; &nbsp; fmt.Println("Created")&nbsp; &nbsp; fmt.Println("Finding")&nbsp; &nbsp; db.First(&client)&nbsp; &nbsp; fmt.Printf("Found %v\n", client)输出:CreatingString() called with 0[2021-01-28 11:39:30]&nbsp; [0.95ms]&nbsp; INSERT INTO "clients" ("client_id","user_id","client_type","created_at") VALUES (9,8,'User','2021-01-28 11:39:30')&nbsp;&nbsp;[1 rows affected or returned ]&nbsp;CreatedFinding[2021-01-28 11:39:30]&nbsp; [1.49ms]&nbsp; SELECT * FROM "clients"&nbsp; &nbsp;LIMIT 1&nbsp;&nbsp;[1 rows affected or returned ]&nbsp;String() called with 0Found {9 8 User 2021-01-28 11:42:31.245628274 +0530 +0530}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go