Sutando: 新的 ORM 轮子
发布于 25 天前 作者 kiddyuchina 903 次浏览 来自 分享

Sutando 是一个全新的 Node.js ORM,支持 MySQL, PostgreSQL, MariaDB, SQLite 等多种数据库,目前只支持 Javascript。

Sutando 借鉴了 PHP 框架 Laravel 的 ORM - Eloquent,如果你之前用过 Laravel,那你使用 Sutando 几乎没有学习成本,因为它们的使用起来几乎相同。

项目地址: https://github.com/sutandojs/sutando

文档地址:https://cn.sutando.org

为什么要用 Sutando?

你可能会问,现在已经有那么多成熟的 ORM 了,为什么还要用 Sutando 呢?

一句话说,就是它 友好易用的 API

  1. 更加符合直觉的查询筛选方式

    Sutando 没有选择把所有查询放在一个参数对象里,也没有特别去设定操作符,而是完全使用链式操作去构建查询语句。下面是一个简单对比的例子,查询出 某个作者浏览量大于 100 的文章:

    // sequelize
    Post.findAll({  
      where: {  
        [Op.or]: [  
          { author_id: 12 },  
          { views: {
            [Op.gt]: 100
          } } 
        ]  
      }  
    });
    
    // prisma
    prisma.post.findMany({
      where: {
        OR: [
          { author_id: 12 },
          { views: {
            gt: 100
          } }
        ]
      }
    });
    
    // sutando
    Post.query().where('author_id', 12).orWhere('views', '>', 100).get();
    

    这个例子已经足够简单,但依然能看出 sutando 要比 sequelize 和 prisma 清晰很多,而且你可能会发现这个写法有点眼熟,没错,Sutando 的查询构造器就是基于 knex。

  2. 更方便的模型关联查询

    这个就不做对比了,大家可以自行脑补其他 ORM 的实现方式,有的 ORM 需要写原生 SQL 语句才能做到(说的就是 prisma)。

    // 预加载, 查找 50 岁以上的用户,并附带查询他们 所有的文章 和 红色的汽车
    const users = await User.query()
      .with(
        'posts',
        { cars: q => q.where('color', 'red') }
      )
      .where('age', '>', 50)
      .get();
    
    // 延迟加载,已经查询到用户的情况下,加载他们的所有文章到相应用户的属性里
    await users.load('posts');
    
    // 直接获取关联数据
    const posts = await user.getRelated('posts');
    
    // 关联筛选
    const redCars = await user.related('cars').where('color', 'red').get();
    
    // 关联模型计数,这样每个用户会多出来一个 posts_count 属性
    const users = await User.query().withCount('posts').get();
    
  3. 其他一些常用的使用方式

    // 分页,会附带 total, currentPage 等一些常用属性和方法
    const users = await User.query().where('age', '>', 23).paginate(15);
    
    // whereX,可以在 where 后直接加上字段名
    const users = await User.query().whereAge('>', 23).paginate(15);
    
    // 模型定义
    const { Model } = require('sutando');
    class User extends Model {
      // 自定义访问器
      // user.full_name
      getFullNameAttribute() {
    	return this.attributes.first_name + ' ' + this.attributes.last_name;
      }
    
      // 自定义作用域
      // User.query().popular().get()
      scopePopular(query) {
    	return query.where('votes', '>', 100);
      }
    
      // 自定义模型关联
      // user.posts
      relationPosts() {
    	return this.hasMany(Post);
      }
    }
    
3 回复

支持乐观锁,事务传播机制,全流程事务,缓存,触发器啥的吗

@ganshiqingyuan 这几个都还没有

knex 是个好东东。 lz 的这个轮子不支持 TS ?

回到顶部