V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
pseudo
V2EX  ›  分享创造

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

  •  2
     
  •   pseudo · 2022-12-07 00:26:27 +08:00 · 1439 次点击
    这是一个创建于 751 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

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

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

    字有点多,来张图吧:

    Banner

    ⬇️ 项目地址

    https://github.com/withtyped/withtyped

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

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

    准备先在真实项目里实践一下试试效果,不错的话我再写一篇文章展开一下这个 approach
    reorx
        3
    reorx  
       2022-12-30 18:20:29 +08:00
    用 SQL 作为 SSoT 也很好,而且因为 SQL 不被语言所限制,乱开个脑洞,未来可以做成能够构建出各种主流语言的 ORM 和脚手架,这样前后端的数据(库)定义就可以非常便捷的统一了
    pseudo
        4
    pseudo  
    OP
       2023-01-04 00:21:41 +08:00 via iPhone
    @reorx 谢谢,好主意。我先在项目里实践看看,后续看能不能拓展一下
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2747 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 84ms · UTC 14:35 · PVG 22:35 · LAX 06:35 · JFK 09:35
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.