gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 10:08:43 31 4
gpt4 key购买 nike

在将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()上调用 ClientType方法,并导致MySQL中的数据类型不匹配,我打算将 ClientType存储在名为 TINYINTclient_type列中。
问题2:
因此,我以为如果我不知道如何覆盖 String()方法的自动调用,我只是将方法重命名为 ToString()并在需要时调用它。现在gorm不能再调用它,而是将整数值转换为数字字符串。因此, USER(即 0)现在将在结果SQL语句中变为 '0',并且 SERVER将变为 '1',尽管MySQL能够将字符串转换为整数。
我仍然想知道我做错了什么,使gorm认为我想要这些转换。
  • 是否有方法可以覆盖String()的调用,所以我仍然可以按常规命名该方法?
  • 是因为使用uint64的其他数字值(ClientID和UserID)不受此问题的影响,所以gorm会将uint8转换为字符串吗?是某种形式的数据库架构缓存使gorm记住了client_type曾经是ENUM('User', 'Service')列的旧架构?
  • 最佳答案

    对于自定义类型的gorm,需要实现Value and Scan
    您也可以尝试在struct中指定类型(用列类型替换 )。

    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}

    关于mysql - 如何防止gorm将自定义整数类型转换为字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65930751/

    31 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com