Golang Go语言中感觉没有一个趁手的 ORM 框架啊?

发布于 1周前 作者 ionicwang 来自 Go语言

Golang Go语言中感觉没有一个趁手的 ORM 框架啊?

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

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

42 回复

自己写一个 。我也觉得 GROM 老不爽了。

更多关于Golang Go语言中感觉没有一个趁手的 ORM 框架啊?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


go 不是银弹 写比上层代码还是换个语言吧

小而丑实现优雅的 orm 不太容易

用的 didi 的 query 生成器。简单 SQL 生成得很爽,复杂 SQL 手动来更方便

gorm+gen 、ent 感觉都不错

#7 当然跟其他语言的 ORM 比那还是差点意思

一直写 rails 的人,被 ar 惯坏了,觉得哪个都不方便

其实都挺好用的,主要还是先入为主。

语言的问题。没有好用的语言,不可能写出好用的库。

之前都在说没有泛型,ORM 是这样难用的 blabla
现在有泛型了,看看哪个会变好用

ent 应该还可以 不过我用的 squirrel + sqlx 也没啥问题

ent 基于代码生成
ent 用着麻烦的地方配合 goqu

sqlx 不错,我比较喜欢写 sql ,而不是生成

用生成器还是可以的,orm 并不好用~~

约定大于配置。之前团队使用代码生成,写好 SQL DDL 之后可以一键生成常用的 gorm 方法。

以前写了很多年 C++,突然有个写.net 的同事问,公司的里的 C++项目没用 orm 的?觉得有点不可思议。后来写 golang 去了,也遇到有人问同样的问题。于是尝试了几个 golang orm ,发现还是手动挡 sql 舒服。所以,存在即合理,总有人喜欢手动挡,有人喜欢自动挡。买菜喜欢自动,赛车喜欢手动

#17 容易一不小心就被注入,每次写 prepare 也麻烦

ent 和 jooq 其实挺像的。

#22 我是 fmt.Sprintf()生成最终语句,不 prepare ,至于注入,如果是面向外部用户的话,的确要注意

gorm 也还好,怎么这么多吐槽的

go 既不可能变成动态语言,也不可能变成另一个 java ,取舍一下吧

总有一些喜欢用记事本写代码的人喊用 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 的场景就蛋疼了。

在Golang(Go语言)生态系统中,确实存在多个ORM(对象关系映射)框架,它们各自具有不同的特点和优势,可以满足不同的开发需求。对于觉得“没有一个趁手的ORM框架”这一观点,我提供以下建议和分析:

  1. GORM:这是Go语言中最流行的ORM框架之一,以其简单易用和丰富的功能著称。它支持多种数据库,如MySQL、PostgreSQL、SQLite等,并提供了自动迁移、钩子函数、事务管理等功能。GORM的链式操作和自动预加载功能也能提高开发效率和查询性能。
  2. XORM:另一个流行的Go语言ORM框架,同样支持多种数据库。XORM提供了丰富的API,支持链式操作,并且具有良好的性能和可扩展性。它还提供了事务管理、缓存和分页等功能。
  3. Gorp:一个简单易用的Go语言ORM框架,支持基本的查询和ORM操作,并提供了事务和预处理功能。虽然其功能相对较少,但对于需要执行基本数据库查询的应用程序来说,Gorp是一个不错的选择。

综上所述,Golang中存在多个优秀的ORM框架可供选择。建议根据项目需求和个人偏好进行评估和选择,也可以尝试结合使用多个框架,以充分利用它们的优势。

回到顶部