Gopher 我们一起来造个 ORM 吧!

2022-07-21 11:36:29 +08:00
 wenjie0032

可能绝大部分搞业务的同学逃不过 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 天后😝)

5976 次点击
所在节点    Go 编程语言
39 条回复
cxytz01
2022-07-21 12:06:47 +08:00
为什么不使用第四种解决方案:4.给开源 orm 库提交 pr ?
teasick
2022-07-21 13:11:26 +08:00
还以为你要实现一个 gopher
kwanzaa
2022-07-21 13:16:48 +08:00
为什么要加微信群
FrankFang128
2022-07-21 13:38:12 +08:00
我觉得 nb 的库基本都是一个人实现的,人越多,逼格越低。
join
2022-07-21 13:39:29 +08:00
可别了,gorm 一天到晚 panic ,然后要在外面写 recover 。
老老实实写 sql 不会死
kiwi95
2022-07-21 13:59:01 +08:00
@join 能分享下 panic 经历吗,在字节内部大量使用 gorm ,单纯因为 gorm 导致 panic 的没怎么见过
join
2022-07-21 14:14:22 +08:00
@kiwi95 没捕获 err ,大量的 a.b.c 这样的 jave 味代码。
linshenqi
2022-07-21 14:20:17 +08:00
一直在用 gorm
danbai
2022-07-21 14:40:57 +08:00
我用 gorm 一般都用 db.raw
danbai
2022-07-21 14:43:44 +08:00
@kiwi95 gorm panic 的情况我只遇到过一种就是传参不对没有传递指针去接收返回。
seth19960929
2022-07-21 14:51:35 +08:00
说实话就 GoFrame 的 dao 我用的最舒服.
https://goframe.org/pages/viewpage.action?pageId=7296196
wenjie0032
2022-07-21 15:27:46 +08:00
@cxytz01 #1 能反馈开源当然是很好的
@seth19960929 #11 周末研究一下
IIInsomnia
2022-07-21 18:05:52 +08:00
ent 不香吗?
ToBeHacker
2022-07-21 18:43:36 +08:00
反射实现一个挺容易的
lesismal
2022-07-21 19:40:11 +08:00
我不信有哪个比我这个 rawsql 好用:
https://github.com/lesismal/sqlw

@join 试试我这个
zoharSoul
2022-07-21 20:52:12 +08:00
最好单表 curd 提供方法, 其他查询写 sql 生成方法是最舒服的
就和 mybatis 一样.

全功能 orm 突出一个难用, 还是这只半自动的舒服
join
2022-07-21 20:53:02 +08:00
@lesismal 小伙子,不是所有人都用 mysql 的
kkkiio
2022-07-21 22:22:33 +08:00
之前给公司自研 ORM 包了层 Spring JPA 的 Query Derivation ,用 go generate 做的,不过依赖公司代码就没放到 GitHub 上了,写了篇 blog: https://kkkiio.github.io/team/2022/01/31/stone-soup.html
EminemW
2022-07-21 22:40:07 +08:00
歪楼问一下,为啥 gorm 没有优化 select * ,还是说有实现但是我没有找到方法
wenjie0032
2022-07-21 23:04:50 +08:00
@kkkiio 大佬的文章中石头汤的故事很有意义,我也尝试过在公司内部推广一些基础工具,封装的类库,低代码工具等,有些使用广泛,有些则无人问津,可以借助石头汤的方法论复盘一下

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

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

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

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

© 2021 V2EX