为什么 Go 中的 ORM 框架使用起来感觉比较怪异

2018-07-14 11:39:48 +08:00
 cc959798

最近研究 Go,做业务系统必然要用到 ORM,毕竟数据库操作太频繁了鞋 SQL 效率太低了

之前用过很多 ORM,比如 JAVA 中的 hibernate,Python 中的 sqlalchemy,PHP 中的 Yii,感觉 ORM 其实都是大同小异 上面的几乎也是类似的使用方式 但是到了 Go,这里感觉画风骤变,了解了 gorm 和 xorm (这两个其实挺像的),里面不在像之前的通过 model 或者 db 进行 find 查询只需要传入条件返回一个查到的对象,2️⃣必须先要 new 一个对象,然后通过指针传入进去,框架也是感觉比较简单的

15199 次点击
所在节点    Go 编程语言
46 条回复
bigpigeon
2018-07-14 16:51:42 +08:00
有一个 orm 方案是生成代码,因为 go 是强类型的,并且不支持模板,所以没法通过返回值取值
ZSeptember
2018-07-14 17:12:48 +08:00
@dodo2012 derive 就是用 macro 实现的,一般就是操作 ast ;自己写的话确实不好用。用别人写好的,现在的 rust ide 支持还太差了,提示不友好。。
dodo2012
2018-07-14 17:14:25 +08:00
@ZSeptember vscode 现在用起来还好,v2 居然还有在用 rust 的啊,很少见,,
janxin
2018-07-14 19:14:47 +08:00
@dodo2012 其实挺多的
cc959798
2018-07-14 21:09:51 +08:00
@luob 这种设计可以用其他方式更改的,比如 select where join 等方法可以返回 DB 实例,可以加个类似的 Query 或者 execute 方法来返回插到的值
cc959798
2018-07-14 21:10:49 +08:00
@bigpigeon 不是有 interface{}吗
pubby
2018-07-14 21:20:06 +08:00
你说的都还好,gorm 最坑的是查询和更新时的零值的处理
ZSeptember
2018-07-14 21:24:09 +08:00
@pubby 我觉得设计的没问题,有什么特殊需求也可以用 hook 解决。
xypcn
2018-07-14 21:27:22 +08:00
https://github.com/ecdiy/gpa 这是我自己实现的 orm,操作与 spring-data-jpa 差不多
pathbox
2018-07-14 22:36:11 +08:00
sqlx 应该会是好的选择
dodo2012
2018-07-14 23:08:20 +08:00
@janxin 是不是哟,一直觉得搞 rust 的很少,特别在国内,主要是,学习曲线太,,高了
youEclipse
2018-07-14 23:47:11 +08:00
@bigpigeon 我用过一个生成代码的 orm 方案,叫 gorp,但是真的很不好用啊。。
JerryCha
2018-07-15 00:31:10 +08:00
传指针啊,这风格很 C
glues
2018-07-15 00:40:16 +08:00
用 go 写业务逻辑,要死人的
ZSeptember
2018-07-15 00:49:32 +08:00
@xypcn 你这个项目跟我的项目名一模一样。。
ZSeptember
2018-07-15 00:57:23 +08:00
感觉大家没有 get 到 LZ 的问题啊。
LZ 问的是为什么这些框架查询的时候需要 new 一个指针作为参数传为 find 方法,而不是像 jpa 那样作为返回值。
其实自己尝试写一下就知道了,go 是做不到 jpa 那种的,go 没有泛型,调用的时候拿不到需要返回的类型信息,就不能在 find 方法里面实例化对象。。jpa 能做到,是因为 Java 的反射能拿到泛型特化信息,然后可以用反射实例化对象,再设置属性值的。
cc959798
2018-07-15 01:17:40 +08:00
@ZSeptember 有道理,Go 的设计感觉还是局限性挺高的,说 Go 的开发效率和脚本语言一样快,真的不敢苟同
cc959798
2018-07-15 01:20:16 +08:00
@ZSeptember 感觉可以不设计成使用统一 db 去查询的方式,可以类似 python 框架中 Django 中的 ORM,使用 Model 进行查询,Model 只需要继承相应的基类就可以实现这种方式,也类似于 PHP 中很多的类似的框架,比如 YII 中的 ORM
当然传统的 ORM 几乎都是这两个设计思路
我个人偏向于后者
orvice
2018-07-15 01:22:16 +08:00
语言特性限制吧,不能想 py/php 那么灵活。
mritd
2018-07-15 07:18:55 +08:00
我觉得是语言特性问题,至于传指针,我倒是觉得很好很清晰,java 把指针藏起来倒难受

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/470825

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX