Golang Go语言中 Gopher 我们一起来造个 ORM 吧

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

可能绝大部分搞业务的同学逃不过 CRUD, 在编程中会有大量的工作与数据库打交道

常见的解决方案一般有以下三种, 1. 原生手写, 2. 开源 orm 类库, 3. 自研 orm 类库

诉求不同方案也就不同, 开发者在 高性能易用性 之前来回权衡, 做出符合自己实际情况的选择.

已经有很多优秀的开源库了 awesome-go-orms, 发起这个小活动的目的

  1. 学习如何设计一个对外 API 稳定的开源库
  2. 设计开源库时保持 api 稳定的情况下如果兼顾可扩展性 (自定义类型, Trace, Logger 等等)
  3. 数据模型抽象, 数据可能保存在 MySQL, MongoDB, Es 等不同的 BD, 甚至是三方 API 如果统一支持?
  4. 多跟优秀的人交流(比如正在看帖的你), 见贤思齐.

我们的思考方式: 我希望能支持 xxx, 这样做的好处是 xxx, 这样做有什么坏处吗, 其他项目是怎么实现的?

比如:

  1. 我希望能自动构造 SQL 语句, 这样做能灵活控制 SQL 条件, 避免硬编码, 坏处可能是出问题了不好定位 sql...
  2. 我希望能查询条件可以是 method(args ...WhereOption) 的形式, 这样做可以根据请求中的参数动态构造约束, 对比链式调用的优势是..., 缺点是...

业余也根据以上方式实践了下 fly, 反复修改了很多次, 也尝试了泛型 /反射等的使用, 有很多地方还没有想清楚, 比如数据模型的描述上, 是用 Options 的模式, 还是 Struct tag 的模式, 优劣是什么 等, 这是一个纯学习性的讨论活动, 有兴趣的大佬们进群一起讨论吧.

这是企微群, 个人微信也可以直接加入, 企微主体是 "爱码士", 我自己建的😂 用这个主要图他这个二维码是活码(其实就是一个中转页面, 进入后出现的那个是系统自动生成的当前可用的群二维码), 不会有 7 天过期(希望帖子能活到 7 天后😝)

contact_me_qr


Golang Go语言中 Gopher 我们一起来造个 ORM 吧

更多关于Golang Go语言中 Gopher 我们一起来造个 ORM 吧的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html

40 回复

为什么不使用第四种解决方案:4.给开源 orm 库提交 pr ?

更多关于Golang Go语言中 Gopher 我们一起来造个 ORM 吧的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


还以为你要实现一个 gopher

为什么要加微信群

我觉得 nb 的库基本都是一个人实现的,人越多,逼格越低。

可别了,gorm 一天到晚 panic ,然后要在外面写 recover 。
老老实实写 sql 不会死

能分享下 panic 经历吗,在字节内部大量使用 gorm ,单纯因为 gorm 导致 panic 的没怎么见过

没捕获 err ,大量的 a.b.c 这样的 jave 味代码。

一直在用 gorm

我用 gorm 一般都用 db.raw

gorm panic 的情况我只遇到过一种就是传参不对没有传递指针去接收返回。

#1 能反馈开源当然是很好的
#11 周末研究一下

ent 不香吗?

反射实现一个挺容易的

我不信有哪个比我这个 rawsql 好用:
https://github.com/lesismal/sqlw

试试我这个

最好单表 curd 提供方法, 其他查询写 sql 生成方法是最舒服的
就和 mybatis 一样.

全功能 orm 突出一个难用, 还是这只半自动的舒服

小伙子,不是所有人都用 mysql 的

之前给公司自研 ORM 包了层 Spring JPA 的 Query Derivation ,用 go generate 做的,不过依赖公司代码就没放到 GitHub 上了,写了篇 blog: https://kkkiio.github.io/team/2022/01/31/stone-soup.html

歪楼问一下,为啥 gorm 没有优化 select * ,还是说有实现但是我没有找到方法

大佬的文章中石头汤的故事很有意义,我也尝试过在公司内部推广一些基础工具,封装的类库,低代码工具等,有些使用广泛,有些则无人问津,可以借助石头汤的方法论复盘一下

我这个也不是只支持 mysql 呀,主要是为了方便标准库 sql 与结构体的映射,并不限制用哪个 driver 。但我不是每个数据库都测了,目前 mysql 和 postgres 是可以的,如果 oracle 、sqlserver 或者其他的数据库有问题(应该只是占位符不一样会导致拼接的 sql 语句错误),我可以继续做兼容。

另外,不知道兄台多大年纪,但我也已经不是小伙子了。

#21
有兴趣的可以看下例子,再对比下 orm ,或者 sqlx 之类的,看看哪个好用。

受限于 Go 语言本身,注定就没有好用的 ORM 框架

等手头项目做完 计划做一个开源轻量查询拼接器,轻 orm

喷了那么久的 gorm, 不打算总打嘴炮

优化 select 是指只 select 用到的字段?这个在 gorm.DB 初始化的时候有一个 SelectFileds 的设置

SQLboiler 看的 API 起来挺舒服,可惜不支持我现在的使用场景,我有几个表恰好他不支持…

捕获 Trim 大佬

真的要整好的 ORM 我只认可 EF Core ,其他的我还不如写 pg/SQL 还跟舒服些

efcore 真是垃圾中的垃圾, deleteById 这样的方法都没有, 必须先通过 id 查出来, 再删除, 脱裤子放屁最在行

手写 sql 能有啥问题

, , , , 感谢评论区大佬们的推荐, 看下来比较喜欢 GoFrame 和 SQLboiler 的实现理念, orm 这种工具实在是重口难调😂, 从我了解到的情况来看, 大部分公司是自研或基于开源项目自研,
也许其中有很多结合自身情况的考量, 后续我会持续迭代个人项目 https://github.com/daodao97/fly, 最起码先自用比较舒服吧, 也算是一个学习积累的过程

额外: GoFrame 的文档写的真心不错, 点赞

gorm 除了 Create 可以批量创建,其他全部手写 sql, raw 或 exec 执行,结果 Scan ,目前没问题,有时 update 时会用 map

ent 设计的不错,不过真用起来还是 sqlbuilder 一把梭

其实我只需要一个能把结果自动映射到我的 go 结构体的框架就够了

做之前建议先用用 rails 的 activerecord 体验一下

ent 是指 fb 新出的那个 orm 库吗?

没用过,我用过 prisma, sequelize, typeorm 这些

可以看看社区的扩展方法,你说的都在扩展方法里面实现了,建议多用用再来发言

当然,很高兴你对使用Go语言构建ORM(对象关系映射)感兴趣!在Go社区中,ORM是一个非常热门且实用的领域,能帮助开发者更高效地操作数据库。

要构建一个基础的ORM,我们需要考虑以下几个核心组件:

  1. 数据库连接管理:首先,我们需要一个能够管理数据库连接的模块,这通常包括连接池的配置和数据库驱动的初始化。

  2. 模型定义:通过结构体和标签(tags)来定义数据库表的结构和字段,比如使用结构体标签来指定字段名、数据类型和约束条件。

  3. SQL生成:根据模型定义自动生成CRUD(创建、读取、更新、删除)操作的SQL语句。

  4. 查询构建器:提供一个链式调用的API,允许开发者以更灵活的方式构建复杂的查询。

  5. 错误处理:确保所有数据库操作都有适当的错误处理机制,包括事务回滚和日志记录。

  6. 性能优化:考虑使用连接池、预编译语句和缓存等技术来提高ORM的性能。

在实际构建过程中,可以参考一些现有的ORM库,如GORM或XORM,它们提供了丰富的功能和良好的文档,是学习ORM设计和实现的好资源。同时,也要注意保持代码的简洁和可读性,以及良好的测试覆盖率,这些都是高质量ORM库的重要特征。祝你项目顺利!

回到顶部