ORM 框架 Sequelize 之模型查找器用法讲解

1,276 阅读3分钟

这是我参与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 是结合了findAllcount两个方法,在处理数据分页相关的查询时非常有用。该方法接收带有两个属性的对象:

  • count-符合查询条件的数据总数
  • rows-获得的数据 示例:
const { count, rows } = await Project.findAndCountAll({
  where: {
    title: {
      [Op.like]: 'foo%'
    }
  },
  offset: 10,
  limit: 2
});

console.log(count);
console.log(rows);

欢迎阅读其它文章