withtyped: 写原生 SQL 即可拥有强类型 API 和客户端,数据库初始化工具,以及动态 OpenAPI 接口

2022-12-07 00:26:27 +08:00
 pseudo

新框架新概念层出不穷,业务总逃不过 CRUD 。与其加一层又一层抽象,或者是生成再同步代码,是不是可以换一个角度,直接处理数据库定义、前后端、和 API 文档之间的同步问题?

在解决完前后端的类型同步问题以后,结合最近的项目实践,我想干脆更进一步:

在 TypeScript 里写 SQL ,然后即可得到四个东西:

  1. 数据库初始化工具
  2. RESTful API 服务( CRUD API 开箱即用,深度定制也没问题)
  3. 类型安全的 JS 客户端(基于 fetch ,并且能自动推导所有 API 的入参和出参)
  4. 动态生成的 OpenAPI 接口

没有代码生成,没有同步时间 - 改一改 SQL ,上述四项就会同步变化,让 VSCode 的 IntelliSense 为你工作就行。

所有组件都是解耦的,比如可以只用路由和客户端,服务器用 Koa/Express/Next 应该都没问题。

字有点多,来张图吧:

⬇️ 项目地址

https://github.com/withtyped/withtyped

自己试了试感觉开发效率有所提升,欢迎大家拍砖讨论

1439 次点击
所在节点    分享创造
4 条回复
reorx
2022-12-12 12:43:14 +08:00
好想法!不过很多人对 SQL 不熟悉,因此喜欢用 ORM 作为 single source of truth ,这也是为什么 prisma 这种库流行的原因。OP 可以考虑把 createModel 再开放一个 ORM 的接口或者接受流行 ORM 库的定义
pseudo
2022-12-16 14:01:49 +08:00
@reorx #1 谢谢。我觉得你说的很有道理,但我们 stay with native SQL 其实就是想利用好 DB 的特性。如果 createModel 变成了 ORM 感觉就有点重复造轮子了?

准备先在真实项目里实践一下试试效果,不错的话我再写一篇文章展开一下这个 approach
reorx
2022-12-30 18:20:29 +08:00
用 SQL 作为 SSoT 也很好,而且因为 SQL 不被语言所限制,乱开个脑洞,未来可以做成能够构建出各种主流语言的 ORM 和脚手架,这样前后端的数据(库)定义就可以非常便捷的统一了
pseudo
2023-01-04 00:21:41 +08:00
@reorx 谢谢,好主意。我先在项目里实践看看,后续看能不能拓展一下

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

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

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

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

© 2021 V2EX