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
相关产品推荐
相关产品推荐

