You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

gRPC请求获取含uint32类型的Book结构体时字段值异常堆叠至单个key的问题求助

gRPC请求获取含uint32类型的Book结构体时字段值异常堆叠至单个key的问题求助

各位大佬好,我现在遇到一个头疼的问题,想请教下大家。我用GORM操作数据库,gRPC做服务通信,之前BookID用string类型的时候一切正常,后来为了让GORM的自增主键功能正常工作,把BookID改成了uint32类型,结果gRPC返回的数据就乱套了——所有字段的值都堆到了edition字段里,其他字段全是空的,但用JSON请求的话返回又是正常的,实在搞不懂原因。

之前正常的配置(BookID为string)

GORM结构体

type Book struct {
    BookID  string `gorm:"primarykey;autoIncrement"`
    Name    string
    Year    string
    Edition string
    Authors []*Author `gorm:"many2many:book_author"`
}

proto生成的Book结构体

type Book struct {
    state         protoimpl.MessageState
    sizeCache     protoimpl.SizeCache
    unknownFields protoimpl.UnknownFields

    Bookid  string `protobuf:"bytes,1,opt,name=bookid,proto3" json:"bookid,omitempty"`
    Name    string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"`
    Year    string `protobuf:"bytes,3,opt,name=year,proto3" json:"year,omitempty"`
    Edition string `protobuf:"bytes,4,opt,name=edition,proto3" json:"edition,omitempty"`
}

服务端UpdateBook函数

func (*server) UpdateBook(ctx context.Context, req *pb.UpdateBookRequest) (*pb.UpdateBookResponse, error) {
    fmt.Println("Update Book")
    var book Book
    reqBook := req.GetBook()

    res := DB.Model(&book).Where("book_id=?", reqBook.Bookid).Updates(
        Book{Name: reqBook.Name, Year: reqBook.Year, Edition: reqBook.Edition})

    if res.RowsAffected == 0 {
        return nil, errors.New("Books not found")
    }

    return &pb.UpdateBookResponse{
        Book: &pb.Book{
            Bookid:  book.BookID,
            Name:    book.Name,
            Year:    book.Year,
            Edition: book.Edition,
        },
    }, nil
}

当时正常的gRPC返回结果

{
    "books": [
        {
            "bookid": "",
            "name": "Логические ошибки",
            "year": "2017",
            "edition": "1"
        },
        {
            "bookid": "",
            "name": "LINUX API исчерпывающее руководство",
            "year": "2017",
            "edition": "1"
        },
        {
            "bookid": "",
            "name": "Сказки громовых",
            "year": "1999",
            "edition": "1"
        },
        {
            "bookid": "",
            "name": "Алгоритмы. Руководство по разработке",
            "year": "2022",
            "edition": "3"
        }
    ]
}

修改后的配置(BookID改为uint32)

现在的GORM结构体

type Book struct {
    BookID  uint32 `gorm:"primarykey;autoIncrement"`
    Name    string
    Year    string
    Edition string
    Authors []*Author `gorm:"many2many:book_author"`
}

现在proto生成的Book结构体

type Book struct {
    state         protoimpl.MessageState
    sizeCache     protoimpl.SizeCache
    unknownFields protoimpl.UnknownFields

    Bookid  uint32 `protobuf:"varint,1,opt,name=bookid,proto3" json:"bookid,omitempty"`
    Name    string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"`
    Year    string `protobuf:"bytes,3,opt,name=year,proto3" json:"year,omitempty"`
    Edition string `protobuf:"bytes,4,opt,name=edition,proto3" json:"edition,omitempty"`
}

现在异常的gRPC返回结果

{
    "books": [
        {
            "bookid": "",
            "name": "",
            "year": "",
            "edition": "еские ошибки2017\"1\nH\b;LINUX API исчерпывающее руководство2017\"1\n*\bСказки громовых1999\"1\nQ\bDАлгоритмы. Руководство по разработке2022\"3\n\"\bРоман Светы2003\"1"
        }
    ]
}

我尝试过的方法

  • 改回BookID为string类型,但这样GORM的自增主键功能就无法正常工作了,不符合需求;
  • 调整过GORM的数据库连接DSN配置,指定了charset=utf8mb4&parseTime=True&loc=Local,但没有效果;

我现在的需求是保留uint32类型的BookID,让GORM正常工作的同时,gRPC也能返回和之前一样正确的结构化数据,实在搞不懂哪里出问题了,希望各位大佬能指点一下!

备注:内容来源于stack exchange,提问作者Darkoment

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.21 16:03:11