在 Node.js 的 Web 应用开发中,ORM 是不可避免的一个主题。Sequelize 是一个值得推荐的 ORM 库,它支持 MySQL、PostgreSQL、SQLite 和 MSSQL 数据库,提供了丰富的功能和接口。在使用 Sequelize 进行 Web 应用开发的过程中,查询是最基础也最核心的一个环节,因此本文整理了 Sequelize 的查询功能。
查询基础
查询构造器
Sequelize 采用类似 jQuery 的查询构造器,使用完整的链式方法调用来构造查询,并最终使用 .then()
或 await
发出请求。例如:
const users = await User.findAll({ where: { age: { [Op.gt]: 18 } }, order: [['createdAt', 'DESC']], limit: 10 });
在这个例子中,使用 User.findAll()
构建一条查询,查询的条件是 age > 18
,按照 createdAt DESC
的顺序,并最多返回 10 条结果。
操作符
Sequelize 提供了丰富的操作符,可以满足各种条件查询的需求。例如:
// javascriptcn.com 代码示例 // 等于 where: { name: 'John' } // 不等于 where: { age: { [Op.ne]: 18 } } // 包含 where: { tags: { [Op.contains]: ['movie'] } } // 不包含 where: { tags: { [Op.notContains]: ['music'] } } // 大于等于 where: { score: { [Op.gte]: 80 } } // 小于等于 where: { score: { [Op.lte]: 90 } }
具体的操作符可以在 官方文档 中查看。
字段选择
查询时可以选择需要查询的字段,以减小查询结果集的大小。例如:
const users = await User.findAll({ attributes: ['name', 'email'] });
在这个例子中,只查询 name
和 email
两个字段。
分页查询
分页查询非常常见,Sequelize 也提供了方便的查询方式。例如:
const users = await User.findAll({ offset: 10, limit: 10 });
在这个例子中,查询从第 10 条记录开始,最多返回 10 条记录。
数据关联查询
在关系型数据库中,我们经常需要进行数据关联查询。Sequelize 支持多种数据关联方式,以下分别介绍。
一对多关联
在一对多的关系中,一个模型拥有多个关联模型。例如,一个博客文章有多个评论,那么博客文章模型就拥有多个评论模型。
定义模型时,需要在一方的模型中使用 hasMany
方法声明多方模型的关联,例如:
// javascriptcn.com 代码示例 class Article extends Model {} Article.init({ // ... }, { sequelize, modelName: 'article' }); class Comment extends Model {} Comment.init({ // ... }, { sequelize, modelName: 'comment' }); Article.hasMany(Comment);
这样,通过 Article 模型可以轻松地查询它拥有的所有 Comment 模型。例如:
const article = await Article.findByPk(1, { include: Comment });
在这个例子中,查询 id 为 1 的 Article 模型,并查询它拥有的所有 Comment 模型。
一对一关联
在一对一的关系中,一个模型只拥有一个关联模型,反之亦然。例如,一个用户只能拥有一个身份证,一个身份证只能属于一个用户。
定义模型时,需要在一方的模型中使用 hasOne
方法声明一方模型的关联,例如:
// javascriptcn.com 代码示例 class User extends Model {} User.init({ // ... }, { sequelize, modelName: 'user' }); class IdCard extends Model {} IdCard.init({ // ... }, { sequelize, modelName: 'idCard' }); User.hasOne(IdCard);
这样,通过 User 模型可以轻松地查询它拥有的 IdCard 模型,反之亦然。例如:
const user = await User.findByPk(1, { include: { model: IdCard } });
在这个例子中,查询 id 为 1 的 User 模型,并查询它拥有的 IdCard 模型。
多对多关联
在多对多的关系中,两个模型相互拥有多个关联模型。例如,一个 Course 模型可以拥有多个 Student 模型,一个 Student 模型也可以拥有多个 Course 模型。
定义模型时,需要在两个模型之间使用 belongsToMany
方法声明两个模型的关联,例如:
// javascriptcn.com 代码示例 class Course extends Model {} Course.init({ // ... }, { sequelize, modelName: 'course' }); class Student extends Model {} Student.init({ // ... }, { sequelize, modelName: 'student' }); Course.belongsToMany(Student, { through: 'course_student' }); Student.belongsToMany(Course, { through: 'course_student' });
这样,通过 Course 模型或 Student 模型都可以轻松地查询它拥有的其他模型。例如:
const course = await Course.findByPk(1, { include: Student }); const student = await Student.findByPk(1, { include: Course });
在这个例子中,查询 id 为 1 的 Course 或 Student 模型,并查询它拥有的其他模型。
总结
Sequelize 是一个功能丰富的 ORM 库,它提供了丰富的查询功能,并支持多种数据关联方式。我们可以使用 Sequelize 构建完整的 Web 应用,并减少与数据库打交道的复杂性。在实际开发中,我们应根据需求选择不同的查询方式,以达到最优的性能和体验。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65836ec1d2f5e1655de5a392