Sutando 是一个全新的 Node.js ORM,支持 MySQL, PostgreSQL, MariaDB, SQLite 等多种数据库,目前只支持 Javascript。
Sutando 借鉴了 PHP 框架 Laravel 的 ORM - Eloquent,如果你之前用过 Laravel,那你使用 Sutando 几乎没有学习成本,因为它们的使用起来几乎相同。
项目地址: https://github.com/sutandojs/sutando
为什么要用 Sutando?
你可能会问,现在已经有那么多成熟的 ORM 了,为什么还要用 Sutando 呢?
一句话说,就是它 友好易用的 API:
-
更加符合直觉的查询筛选方式
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。
-
更方便的模型关联查询
这个就不做对比了,大家可以自行脑补其他 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();
-
其他一些常用的使用方式
// 分页,会附带 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); } }