Go 感觉没有一个趁手的 ORM 框架啊?

2021-12-05 19:23:22 +08:00
 KevinBlandy

我本来是搞 Java 的。一直用 QueryDslJooq 这种 DSL 风格的 ORM ,感觉老棒了。

但是 Go 好像没,grom/xorm 都 jio 得难用。

10562 次点击
所在节点    Go 编程语言
41 条回复
openp2p
2021-12-06 11:37:49 +08:00
以前写了很多年 C++,突然有个写.net 的同事问,公司的里的 C++项目没用 orm 的?觉得有点不可思议。后来写 golang 去了,也遇到有人问同样的问题。于是尝试了几个 golang orm ,发现还是手动挡 sql 舒服。所以,存在即合理,总有人喜欢手动挡,有人喜欢自动挡。买菜喜欢自动,赛车喜欢手动
cloverzrg2
2021-12-06 11:43:58 +08:00
@hjahgdthab750 #17 容易一不小心就被注入,每次写 prepare 也麻烦
HanMeiM
2021-12-06 11:48:05 +08:00
ent 和 jooq 其实挺像的。
qW7bo2FbzbC0
2021-12-06 11:50:07 +08:00
@cloverzrg2 #22 我是 fmt.Sprintf()生成最终语句,不 prepare ,至于注入,如果是面向外部用户的话,的确要注意
momowei
2021-12-06 11:53:35 +08:00
gorm 也还好,怎么这么多吐槽的
keepeye
2021-12-06 11:58:25 +08:00
go 既不可能变成动态语言,也不可能变成另一个 java ,取舍一下吧
Hanggi
2021-12-06 12:18:12 +08:00
总有一些喜欢用记事本写代码的人喊用 IDE 的人都是菜鸟,代码就得纯手写才舒服。
整的好像用 ORM 的人都看不懂也不会写 SQL 似的。
项目上点 Star 的那几万人也不可能都傻,肯定是满足了自身需求才用的,觉得不好用就换一个就好了。
gowk
2021-12-06 12:49:38 +08:00
一直写 .net 的人,被 ef/dapper 惯坏了,觉得哪个都不方便
zjsxwc
2021-12-06 12:59:24 +08:00
gorm 总比手动 sql 好吧
Linvas
2021-12-06 14:04:54 +08:00
duanquanyong
2021-12-06 17:05:45 +08:00
强裂推荐 sqlc ( https://github.com/kyleconroy/sqlc

支持各种 migration 工具格式文件,手写 sql quer 文件,生成 go 代码和 Repostiory 接口
waltcow
2021-12-06 17:17:38 +08:00
matrix1010
2021-12-06 17:22:00 +08:00
对于天天写 CRUD 的兄弟们我只推荐 Ent ,真正的生产力工具。现在 v0.9.1 Custom Template 可扩展的地方更多了,定制化需求也能够满足。个人观点 Go web 开发只有配合代码生成才具有生产力。另外对于写 CRUD 还写测试的兄弟们可以试试我的 factory 轮子: https://github.com/Yiling-J/carrier, 类 factory_bot/boy 自动生成测试数据
weichengwu
2021-12-06 17:31:39 +08:00
@lqs #19 我孤陋寡闻了,第一次见到点号写在行末的风格,感觉好奇怪
branchWater
2021-12-06 17:40:44 +08:00
@weichengwu java 不也是这种风格吗?函数太长了也得换行
Hanggi
2021-12-06 17:43:20 +08:00
@branchWater
他的意思是别的语言都是
db.query()
.find()

但是 go 语言是
db.query().
find()

对吧
@weichengwu
branchWater
2021-12-06 17:52:20 +08:00
@Hanggi java 的点号放到行首和行末也都行啊,奇怪的在什么地方
cmdOptionKana
2021-12-06 18:07:55 +08:00
ent 还不好用?
justsosososo
2021-12-07 10:17:42 +08:00
sciel
2021-12-09 13:33:42 +08:00
用 goframe 吧

```
func (m *roleMenu) List(page int, size int, id string, rid string, mid string) (int, gdb.List) {
db := g.DB().Model(dao.RoleMenu.Table + " t1").
LeftJoin(dao.Role.Table + " t2 on t1.rid = t2.id").
LeftJoin(dao.Menu.Table + " t3 on t1.mid = t3.id")
if id != "" {
db = db.Where("t1.id", id)
}
if rid != "" {
db = db.Where("t1.rid", rid)
}
if mid != "" {
db = db.Where("t1.mid", mid)
}
count, _ := db.Count()
db.Fields("t2.name r_name,t3.name m_name,t1.id id")
all, _ := db.Limit(size).Offset((page - 1) * size).Order("t1.id desc").All()
if all.IsEmpty() {
return count, gdb.List{}
}
return count, all.List()
}
```

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

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

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

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

© 2021 V2EX