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

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

  •  
  •   kiddyu ·
    kiddyuchina · 355 天前 · 3487 次点击
    这是一个创建于 355 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    特性:

    • 超级友好的 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  
       355 天前
    很棒

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

    写 query 一路 ctrl + space 下去就行了
    kiddyu
        9
    kiddyu  
    OP
       355 天前
    @SayHelloHi 谢谢,因为用法一样,文档直接 copy 的 Laravel :D
    kiddyu
        10
    kiddyu  
    OP
       355 天前
    @0x723b kysely 很好,在查询构建器里,以后应该会取代 knex 了,后边看看能不能用它把 Sutando 里的 knex 换掉
    kiddyu
        11
    kiddyu  
    OP
       355 天前
    @XCFOX 自己在用的时候写了 Declaretions ,只是还不全,后边会补上
    kiddyu
        12
    kiddyu  
    OP
       355 天前
    @colliedog 大部分时候还是香的,就是之前在用 prisma 的时候,有几个地方因为功能不支持,需要自己手写 SQL ,就是因为这个才写了 Sutando
    kiddyu
        13
    kiddyu  
    OP
       355 天前
    @Leviathann 楼上提到的 kysely 也是 type safe ,也是这种 api ,这个没什么吧
    fds
        14
    fds  
       354 天前
    哇,厉害,行动力真强。
    yafoo
        15
    yafoo  
       354 天前 via Android
    我觉得 thinkphp3.2 的 orm 挺好的,复刻了一部分到我的项目 jj.js
    treblex
        16
    treblex  
       353 天前 via iPhone
    @Leviathann django 那个可好玩了 age__gt 这样子传
    zbowen66
        17
    zbowen66  
       353 天前
    支持 edge runtime 吗? prisma 的官方代理一言难尽...
    kiddyu
        18
    kiddyu  
    OP
       351 天前
    @zbowen66 next.js 的 edge runtime 吗?我试了下还不支持,knex 用到了一些不支持的包
    kiddyu
        19
    kiddyu  
    OP
       351 天前
    @luckrnx09 drizzle-orm 现在很火啊,只是国内好像很少人提。其实我感觉 drizzle-orm 更像个查询构建器而不是 ORM 。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5698 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 03:13 · PVG 11:13 · LAX 19:13 · JFK 22:13
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.