这是我参与8月更文挑战的第10天,活动详情查看:8月更文挑战
如果你使用过 Node.js 开发过后端接口,那么一定熟悉 Sequelize 框架,它是一个基于 Promise 的 ORM。目前支持 Postgres、MySQL、MariaDB、SQLite 以及 Microsoft SQL Server。 它具有强大的事务支持,关联关系,预读和延迟加载,读取复制等功能。
什么是模型查找器
Model finder(模型查找器),可以理解成一个自动生成SELECT查询的方法,结合常用的查询场景,实现更快捷的查询操作。
一般情况下,Sequelize 会自动的将所有内容包装在适当的实例对象中,如果你不想收到这种相应,需要将以下内容作为参数传递给 finder 方法。
{ raw: true}
findAll
顾名思义,查找所有符合条件的数据,除非遇到where子句的约束,否则会返回模型的所有数据。示例:
Model.findAll();
findOne
查找符合条件的数据,并且只返回第一条数据。示例:
const article = await Article.findOne({
where: {
title: article.title
}
});
findByPk
根据模型主键查找,且只查找一条数据,否则返回 null。该查找器适合查询单条数据且查询内容为主键的形式。示例:
const user = await User.findByPk(user_id);
if(!user){
console.log('Not user');
} else {
console.log('user instanceof User'); // true
}
如果使用其它查查找器,则需要额外添加where子句。示例:
const user = await User.findOne({
where: {
id: user_id
}
});
if(!user){
console.log('Not user');
} else {
console.log('user instanceof User'); // true
}
findOrCreate
有些时候,我们不确定查询的数据是否在数据表中,而且如果数据不存在,则相应的进行 insert 插入该条数据,普通查询的做法如下。示例:
const user = await User.findByPk(user_id);
if(!user){
User.create({
name: user_name,
sex: user_sex
});
return;
}
return user;
而findOrCreate则结合了上面两个方法,除非找到满足查询参数的结果,否则将在表中创建该条数据。这个方法接受两个参数,一个是实例和一个布尔值,表示该条数据是已经创建还是已经存在。
这个查找器使用where来约束查询条件,使用default来定义创建的内容。上面的例子使用该查找器改造后写法如下。示例:
const [user, created] = await User.findOrCreate({
where: { id: user_id },
defaults: {
name: user_name,
sex: user_sex
}
});
console.log(created); // 标识该实例是否刚刚创建的布尔值
findAndCountAll
findAndCountAll 是结合了findAll和count两个方法,在处理数据分页相关的查询时非常有用。该方法接收带有两个属性的对象:
count-符合查询条件的数据总数rows-获得的数据 示例:
const { count, rows } = await Project.findAndCountAll({
where: {
title: {
[Op.like]: 'foo%'
}
},
offset: 10,
limit: 2
});
console.log(count);
console.log(rows);