Golang Go语言中感觉没有一个趁手的 ORM 框架啊?
自己写一个 。我也觉得 GROM 老不爽了。
更多关于Golang Go语言中感觉没有一个趁手的 ORM 框架啊?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
ent
https://entgo.io/
还行
go 不是银弹 写比上层代码还是换个语言吧
https://github.com/go-gorm/gen
这个能靠近一点 jooq 吧
小而丑实现优雅的 orm 不太容易
用的 didi 的 query 生成器。简单 SQL 生成得很爽,复杂 SQL 手动来更方便
gorm+gen 、ent 感觉都不错
ent 不错
laravel 吧
其实都挺好用的,主要还是先入为主。
语言的问题。没有好用的语言,不可能写出好用的库。
之前都在说没有泛型,ORM 是这样难用的 blabla
现在有泛型了,看看哪个会变好用
ent 应该还可以 不过我用的 squirrel + sqlx 也没啥问题
ent 基于代码生成
ent 用着麻烦的地方配合 goqu
用生成器还是可以的,orm 并不好用~~
再次推销一下 sqlingo https://github.com/lqs/sqlingo
约定大于配置。之前团队使用代码生成,写好 SQL DDL 之后可以一键生成常用的 gorm 方法。
以前写了很多年 C++,突然有个写.net 的同事问,公司的里的 C++项目没用 orm 的?觉得有点不可思议。后来写 golang 去了,也遇到有人问同样的问题。于是尝试了几个 golang orm ,发现还是手动挡 sql 舒服。所以,存在即合理,总有人喜欢手动挡,有人喜欢自动挡。买菜喜欢自动,赛车喜欢手动
#17 容易一不小心就被注入,每次写 prepare 也麻烦
ent 和 jooq 其实挺像的。
#22 我是 fmt.Sprintf()生成最终语句,不 prepare ,至于注入,如果是面向外部用户的话,的确要注意
gorm 也还好,怎么这么多吐槽的
总有一些喜欢用记事本写代码的人喊用 IDE 的人都是菜鸟,代码就得纯手写才舒服。
整的好像用 ORM 的人都看不懂也不会写 SQL 似的。
项目上点 Star 的那几万人也不可能都傻,肯定是满足了自身需求才用的,觉得不好用就换一个就好了。
一直写 .net 的人,被 ef/dapper 惯坏了,觉得哪个都不方便
gorm 总比手动 sql 好吧
强裂推荐 sqlc ( https://github.com/kyleconroy/sqlc )
支持各种 migration 工具格式文件,手写 sql quer 文件,生成 go 代码和 Repostiory 接口
对于天天写 CRUD 的兄弟们我只推荐 Ent ,真正的生产力工具。现在 v0.9.1 Custom Template 可扩展的地方更多了,定制化需求也能够满足。个人观点 Go web 开发只有配合代码生成才具有生产力。另外对于写 CRUD 还写测试的兄弟们可以试试我的 factory 轮子: https://github.com/Yiling-J/carrier, 类 factory_bot/boy 自动生成测试数据
#19 我孤陋寡闻了,第一次见到点号写在行末的风格,感觉好奇怪
java 不也是这种风格吗?函数太长了也得换行
他的意思是别的语言都是
db.query()
.find()
但是 go 语言是
db.query().
find()
对吧
java 的点号放到行首和行末也都行啊,奇怪的在什么地方
ent 还不好用?
用 goframe 吧<br>func (m *roleMenu) List(page int, size int, id string, rid string, mid string) (int, gdb.List) {<br> db := g.DB().Model(dao.RoleMenu.Table + " t1").<br> LeftJoin(dao.Role.Table + " t2 on t1.rid = <a target="_blank" href="http://t2.id" rel="nofollow noopener">t2.id</a>").<br> LeftJoin(dao.Menu.Table + " t3 on t1.mid = <a target="_blank" href="http://t3.id" rel="nofollow noopener">t3.id</a>")<br> if id != "" {<br> db = db.Where("<a target="_blank" href="http://t1.id" rel="nofollow noopener">t1.id</a>", id)<br> }<br> if rid != "" {<br> db = db.Where("t1.rid", rid)<br> }<br> if mid != "" {<br> db = db.Where("t1.mid", mid)<br> }<br> count, _ := db.Count()<br> db.Fields("<a target="_blank" href="http://t2.name" rel="nofollow noopener">t2.name</a> r_name,<a target="_blank" href="http://t3.name" rel="nofollow noopener">t3.name</a> m_name,<a target="_blank" href="http://t1.id" rel="nofollow noopener">t1.id</a> id")<br> all, _ := db.Limit(size).Offset((page - 1) * size).Order("<a target="_blank" href="http://t1.id" rel="nofollow noopener">t1.id</a> desc").All()<br> if all.IsEmpty() {<br> return count, gdb.List{}<br> }<br> return count, all.List()<br>}<br>
#31 sqlc 的确不错,但是只适合固定的 sql ,遇到需要 dynamic query 的场景就蛋疼了。