为什么 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 一个对象,然后通过指针传入进去,框架也是感觉比较简单的

15336 次点击
所在节点    Go 编程语言
46 条回复
xypcn
2018-07-15 09:14:28 +08:00
@ZSeptember 你的方案不好用.我的方案,使用与 java 对比如下:

定义 SQL

type SqlAction struct {
SysRoleDel func(roleId int64, roleId2 int64) (int64, error) `delete from SysRole where id=? and creator!=0 and 0=(SELECT count(*) from SysUserRole where roleId=?)`
// insert ,delete update 都可以使用
// select 可以返回 int,int64,string,map[string]string []int,[]......... []map[string]string object 都能反射
}

类似 JAVA spring-data interface 定义 SQL


sqlAction := &SqlAction{}

orm := GetGpa("mysql", "root:root@tcp(127.0.0.1:3306)/base-sys-user?timeout=30s&charset=utf8&parseTime=true",
sqlAction)

golang 没有 java 的注入之类,显示实例化,java 的实例化可以通过注入,这个可以是全局变量

调用: sqlAction.SysRoleDel(48)

与 java 一样方便。

一个 orm 框架,至少要分离 sql 的调用。

GetDb().Table("model").Find(&model, " id =? ", id) 这种设计肯定是没有理解 java 的 spring-data 接口设计,
也是很多 java 开发者看起来比较怪异的地方


@glues go 写业务逻辑与 java 一样方便,只是你不熟悉而已,至少需要一年以上的累积,go 的起步较高,
它是认为开发者已经精通一门开发语言了,一个好的项目推广比较难,一般是一个公司,或是先发,累积。
tcp
2018-07-15 09:24:44 +08:00
我?
ZSeptember
2018-07-15 09:35:39 +08:00
@xypcn 我觉得你没看明白。我的是个代码生成器,不是 ORM。生成的规则是 spring-data-jpa 的方法命名,生成的代码是基于 gorm 的,你吐槽的是 gorm 的设计。不过这也是仁者见仁的事情。Java 也有 jooq,这种框架,spring-data-jpa 也有 query DSL 也是这种形式的。
bigpigeon
2018-07-15 10:46:06 +08:00
@cc959798 返回 interface{}还得强转,还得知道你想要什么类型才能强转,还不如直接传引用来的方便
my3157
2018-07-15 22:22:19 +08:00
主要还是 go 的 reflect 太弱了
nocrush
2018-07-19 15:28:11 +08:00
laravel orm 我觉得是我用过中最好用的

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

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

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

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

© 2021 V2EX