Sutando: 把最好用的 ORM 复刻到 Node.js - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
kiddyu

Sutando: 把最好用的 ORM 复刻到 Node.js

  •  
  •   kiddyu
    kiddyuchina 2024 年 1 月 4 日 4801 次点击
    这是一个创建于 842 天前的主题,其中的信息可能已经有所发展或是发生改变。

    在 v2 很多帖子都可以看到,Laravel 和 Rails 的 ORM 几乎是大家公认最好用的 ORM ,Sutando 就是他们在 Node.js 里的 “复刻版”,如果你之前用过 Laravel ,那你使用 Sutando 几乎没有学习成本,因为它们的使用起来几乎相同 (功能实现了 80%+)。

    地址: https://github.com/sutandojs/sutando
    文档: https://sutando.org/a>

    特性:

    • 超级友好的 API
    • 支持 MySQL, MariaDB, PostgreSQL, SQLite, MSSQL 等多种数据库(因为基于 knex )
    • 灵活的模型关联
    • 在不同模型操作阶段自定义钩子
    • 简单的插件机制

    安装:

    npm install sutando mysql2 --save 

    建立连接 & 定义模型:

    const { sutando, Model } = require('sutando'); // 连接信息 sutando.addConnection({ client: 'mysql2', connection: { host : '127.0.0.1', port : 3306, user : 'root', password : '', database : 'test' }, }); const db = sutando.connection(); // 查询构造器 const users = await db.table('users').where('age', '>', 35).get(); // 模型定义 class User extends Model {} 

    CRUD:

    // 查询 const users = await User.query().where('age', '>', 35).get(); // 新增 const user = new User; user.name = 'David Bowie'; await user.save(); // 删除 await user.delete(); // 分页 const users = await User.query().paginate(1, 15); // 关联预加载 const users = await User.query().with('posts').get(); // 关联条件 const users = await User.query().with({ posts: q => q.where('likes_count', '>', 100) }).get(); // 关联延迟加载 await user.load('posts'); await users.load('posts'); 

    最后:Welcome Star, PR and Issues !

    19 条回复    2024-01-08 14:43:44 +08:00
    SayHelloHi
        1
    SayHelloHi  
       2024 年 1 月 4 日
    很棒

    文档很完善
    luckrnx09
        2
    luckrnx09  
       2024 年 1 月 4 日
    厉害了。前不久看到 https://github.com/drizzle-team/drizzle-orm ,感觉楼主写的这个跟它有点像。
    0x723b
        3
    0x723b  
       2024 年 1 月 4 日
    可以看看 kysely ,用起来比 knex 舒服很多
    0x723b
        4
    0x723b  
       2024 年 1 月 4 日
    XCFOX
        5
    XCFOX  
       2024 年 1 月 4 日   1
    我来给泼个冷水
    2024 年了居然还没有 TypeScript Declaretions
    你可以不用 TypeScript 但不能没有 Declaretions
    colliedog
        6
    colliedog  
       2024 年 1 月 4 日   1
    prisma 不香吗?
    zhengfan2016
        7
    zhengfan2016  
       2024 年 1 月 4 日
    @colliedog 要是能把 prisma 复刻到 PHP 那边就好了哈哈,
    Leviathann
        8
    Leviathann  
       2024 年 1 月 4 日   4
    where('age', '>', 35)
    幽默,这种 api ,拿头跟别人 full type safe 的 api 比

    写 query 一路 ctrl + space 下去就行了
    kiddyu
        9
    kiddyu  
    OP
       2024 年 1 月 5 日
    @SayHelloHi 谢谢,因为用法一样,文档直接 copy 的 Laravel :D
    kiddyu
        10
    kiddyu  
    OP
       2024 年 1 月 5 日
    @0x723b kysely 很好,在查询构建器里,以后应该会取代 knex 了,后边看看能不能用它把 Sutando 里的 knex 换掉
    kiddyu
        11
    kiddyu  
    OP
       2024 年 1 月 5 日
    @XCFOX 自己在用的时候写了 Declaretions ,只是还不全,后边会补上
    kiddyu
        12
    kiddyu  
    OP
       2024 年 1 月 5 日
    @colliedog 大部分时候还是香的,就是之前在用 prisma 的时候,有几个地方因为功能不支持,需要自己手写 SQL ,就是因为这个才写了 Sutando
    kiddyu
        13
    kiddyu  
    OP
       2024 年 1 月 5 日
    @Leviathann 楼上提到的 kysely 也是 type safe ,也是这种 api ,这个没什么吧
    fds
        14
    fds  
       2024 年 1 月 5 日
    哇,厉害,行动力真强。
    yafoo
        15
    yafoo  
       2024 年 1 月 5 日 via Android
    我觉得 thinkphp3.2 的 orm 挺好的,复刻了一部分到我的项目 jj.js
    treblex
        16
    treblex  
       2024 年 1 月 6 日 via iPhone
    @Leviathann django 那个可好玩了 age__gt 这样子传
    zbowen66
        17
    zbowen66  
       2024 年 1 月 7 日
    支持 edge runtime 吗? prisma 的官方代理一言难尽...
    kiddyu
        18
    kiddyu  
    OP
       2024 年 1 月 8 日
    @zbowen66 next.js 的 edge runtime 吗?我试了下还不支持,knex 用到了一些不支持的包
    kiddyu
        19
    kiddyu  
    OP
       2024 年 1 月 8 日
    @luckrnx09 drizzle-orm 现在很火啊,只是国内好像很少人提。其实我感觉 drizzle-orm 更像个查询构建器而不是 ORM 。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     917 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 54ms UTC 19:38 PVG 03:38 LAX 12:38 JFK 15:38
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86