golang gRPC xorm 如何优雅的解决proto没有int类型?

limaoxiaoer · 2021-03-10 18:14:54 · 2566 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2021-03-10 18:14:54 的主题,其中的信息可能已经有所发展或是发生改变。

我想利用gRPC 和 xorm 实现数据库查询 比如:

type Info struct{
    Age int //数据库中此字段是int
}

由于gRPC中只有int32类型 所以只能:

message _Info struct{
    int32 Age = 1}

数据库查询的时候由于字段类型的缘故 无法直接以 Get(&_Info)来获取,并直接传输走 只能进行赋值

info :=Info{}
Get(&info)
_Info.Age = info.Age

再把_Info传输走

但是如果查询的结构体中字段超多怎么办?

只能一个个对应赋值么?

有没有别的优雅点的办法

(我知道golang 有个net/rpc库,支持int。但我就是想知道用gRPC的话怎么解决)


有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

2566 次点击  
加入收藏 微博
29 回复  |  直到 2021-03-17 11:29:10
focusonline
focusonline · #1 · 4年之前

自己写个工具用反射解决不行么

zzustu
zzustu · #2 · 4年之前

你这个跟xorm gRPC没什么关系吧。 xorm 映射的结构体是 Info, gRPC对应的是 _Info,两个结构体除了看着像,根本就不是一个struct。首先就不能被intint32带偏了。可以按照1L说的那样写个工具类,比如类似Java的 BeanUtils.copyProperties

limaoxiaoer
limaoxiaoer · #3 · 4年之前
focusonlinefocusonline #1 回复

自己写个工具用反射解决不行么

额 那好吧 我自己写吧
还以为能有什么偷懒的方法

jarlyyn
jarlyyn · #4 · 4年之前

数据库中此字段是int

????

数据库没oglang 的int这个类型啊……

golang中的int是一个不定长度变量,由架构决定是int32还是int64。

严格来说,用于持久化的数据库对应的orm 对象也该是定好int32还是int64的

limaoxiaoer
limaoxiaoer · #5 · 4年之前

2楼 @zzustu 就我理想是,可以直接用proto的结构体直接用来接收查询结果,直接返回就得了 那还是自己写个小工具吧

= =

zzustu
zzustu · #6 · 4年之前
limaoxiaoerlimaoxiaoer #5 回复

2楼 @zzustu 就我理想是,可以直接用proto的结构体直接用来接收查询结果,直接返回就得了 那还是自己写个小工具吧 = =

那样直接用_Info接收数据库的查询,有什么不可吗?实在不行数据类型改一致。都改成int32

info := _Info{}
Get(&info)
limaoxiaoer
limaoxiaoer · #7 · 4年之前
jarlyynjarlyyn #4 回复

数据库中此字段是int ???? 数据库没oglang 的int这个类型啊…… golang中的int是一个不定长度变量,由架构决定是int32还是int64。 严格来说,用于持久化的数据库对应的orm 对象也该是定好int32还是int64的

啊 是我没表述清楚

用xorm的话,他只有int 和 BigInt类型

这不就跟proto的结构体不能同用一个了么。。

要有个重新赋值给另一个结构体过程

我就想问问有没有什么巧妙优雅的方法解决一下

limaoxiaoer
limaoxiaoer · #8 · 4年之前
zzustuzzustu #6 回复

#5楼 @limaoxiaoer 那样直接用`_Info`接收数据库的查询,有什么不可吗?实在不行数据类型改一致。都改成`int32` ```go info := _Info{} Get(&info) ```

xorm不支持int32啊。。。。

只有int 和 BigInt

直接用这个int32的结构体去Get 是搜不到的。。。

zzustu
zzustu · #9 · 4年之前
limaoxiaoerlimaoxiaoer #8 回复

#6楼 @zzustu xorm不支持int32啊。。。。 只有int 和 BigInt 直接用这个int32的结构体去Get 是搜不到的。。。

你的意思是使用xorm框架。如果struct里面定义的有int32的field,会报错?

zzustu
zzustu · #10 · 4年之前
limaoxiaoerlimaoxiaoer #8 回复

#6楼 @zzustu xorm不支持int32啊。。。。 只有int 和 BigInt 直接用这个int32的结构体去Get 是搜不到的。。。

数据库里面有TINYINT类型go没有这种类型,难道非要让golang造一个TINYINT类型与之对应么。感觉你自己都没太理解这些东西

jarlyyn
jarlyyn · #11 · 4年之前
limaoxiaoerlimaoxiaoer #8 回复

#6楼 @zzustu xorm不支持int32啊。。。。 只有int 和 BigInt 直接用这个int32的结构体去Get 是搜不到的。。。

xorm是一款go orm吧?

go orm怎么会有bigint这种go没有的数据类型……

去看了下xorm的文档

https://gobook.io/read/gitea.com/xorm/manual-zh-CN/chapter-02/1.mapping.html

https://gobook.io/read/gitea.com/xorm/manual-zh-CN/chapter-02/5.types.html

你所谓的int和bigint明显是数据库字段类型

明显数据库int对应的是int32那一堆

数据库的的bigint对应的是int64/uint64

所以很多时候不建议直接用orm啊,容易搞不清实际的语言和数据库对应关系……

focusonline
focusonline · #12 · 4年之前
limaoxiaoerlimaoxiaoer #8 回复

#6楼 @zzustu xorm不支持int32啊。。。。 只有int 和 BigInt 直接用这个int32的结构体去Get 是搜不到的。。。

你要么看看xorm的tag model定义 看看能不能找到有用的内容帮助你定义出来int32

aixinaxc
aixinaxc · #13 · 4年之前
focusonlinefocusonline #1 回复

自己写个工具用反射解决不行么

总可以看到你

focusonline
focusonline · #14 · 4年之前
aixinaxcaixinaxc #13 回复

#1楼 @focusonline 总可以看到你

空虚寂寞冷不行啊

aixinaxc
aixinaxc · #15 · 4年之前

@focusonline 哈哈哈哈哈哈,出来玩耍

focusonline
focusonline · #16 · 4年之前
aixinaxcaixinaxc #15 回复

@focusonline 哈哈哈哈哈哈,出来玩耍

要离职了.不玩了.回家种地去喽.

aixinaxc
aixinaxc · #17 · 4年之前

@focusonline 不行,不能跑路

focusonline
focusonline · #18 · 4年之前
aixinaxcaixinaxc #17 回复

@focusonline 不行,不能跑路

没办法, 这边不出钱了, 想不走也不行啊

aixinaxc
aixinaxc · #19 · 4年之前

@focusonline 你在哪里讨生活呀

focusonline
focusonline · #20 · 4年之前
aixinaxcaixinaxc #19 回复

@focusonline 你在哪里讨生活呀

魔都.月黑风高的冒险家乐园

aixinaxc
aixinaxc · #21 · 4年之前

@focusonline 来帝都玩呀

focusonline
focusonline · #22 · 4年之前
aixinaxcaixinaxc #21 回复

@focusonline 来帝都玩呀

没钱没美女没空... 哈哈哈

aixinaxc
aixinaxc · #23 · 4年之前

@focusonline 美女一箩筐,票子一大把

limaoxiaoer
limaoxiaoer · #24 · 4年之前
zzustuzzustu #10 回复

#8楼 @limaoxiaoer 数据库里面有TINYINT类型go没有这种类型,难道非要让golang造一个TINYINT类型与之对应么。感觉你自己都没太理解这些东西

是这样的

用xorm框架的话,操作数据库,struct里面不能用int32这个类型。

xorm是int类型代表了除64位以外的int。64的用BigInt

所以利用xorm就用不了int32,如果用int32的话搜不到东西。

所以我现在 proto + xorm 就不得不出现两个结构体, xorm:int版本结构体 , proto:int32版本结构体。。。

这之间就必须出现一个赋值操作,就感觉很蛋疼

limaoxiaoer
limaoxiaoer · #25 · 4年之前
jarlyynjarlyyn #11 回复

#8楼 @limaoxiaoer xorm是一款go orm吧? go orm怎么会有bigint这种go没有的数据类型…… 去看了下xorm的文档 https://gobook.io/read/gitea.com/xorm/manual-zh-CN/chapter-02/1.mapping.html https://gobook.io/read/gitea.com/xorm/manual-zh-CN/chapter-02/5.types.html 你所谓的int和bigint明显是数据库字段类型 明显数据库int对应的是int32那一堆 数据库的的bigint对应的是int64/uint64 所以很多时候不建议直接用orm啊,容易搞不清实际的语言和数据库对应关系……

就感觉本应该很干脆的事儿

结果因为这个数据类型

从xorm获取后不能直接返回

好恶心

jarlyyn
jarlyyn · #26 · 4年之前
limaoxiaoerlimaoxiaoer #25 回复

#11楼 @jarlyyn 就感觉本应该很干脆的事儿 结果因为这个数据类型 从xorm获取后不能直接返回 好恶心

limaoxiaoer
limaoxiaoer · #27 · 4年之前
focusonlinefocusonline #12 回复

#8楼 @limaoxiaoer 你要么看看xorm的tag model定义 看看能不能找到有用的内容帮助你定义出来int32

不能。。。

目前我只能再写个结构体,然后再写个赋值的方法

看着一堆结构体就烦

zzustu
zzustu · #28 · 4年之前
limaoxiaoerlimaoxiaoer #27 回复

#12楼 @focusonline 不能。。。 目前我只能再写个结构体,然后再写个赋值的方法 看着一堆结构体就烦

那干脆都用int64呢

limaoxiaoer
limaoxiaoer · #29 · 4年之前
zzustuzzustu #28 回复

#27楼 @limaoxiaoer 那干脆都用int64呢

我擦。。。居然可以

是我格局小了

😂

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传