Sequelize 中常用的一些方法和参数

  最近 koa2 项目中用到的 ORM 是 Sequelize V6,记录一下相关知识点。

  Sequelize 中文文档Sequelize 中文API文档-2. Model 的定义、使用与Model类的API

一、常用方法

1、findAll

  findAll 从数据库读取整个表:

1
2
const user = await User.findAll()
SELECT * FROM User;
(1)SELECT 特定属性attributes

  选择某些特定属性,可以使用attributes参数:

1
2
3
4
User.findAll({
attributes: ['name', 'age']
})
SELECT name, age FROM User;

  可以使用嵌套数组来重命名属性:

1
2
3
4
User.findAll({
attributes: ['name', ['age', 'ageage'], 'hats']
})
SELECT name, age AS ageage, hats FROM User;

  可以使用sequelize.fn进行聚合。使用聚合函数时,必须为它提供一个别名,以便能够从 Model 中访问它。在下面的示例中,可以通过instance.n_hats获取帽子数量:

1
2
3
4
5
6
7
8
User.findAll({
attributes: [
'name',
[sequelize.fn('COUNT', sequelize.col('hats')), 'n_hats'],
'age'
]
})
SELECT name, COUNT(hats) AS n_hats, age FROM User;

  不用列出所有属性,也可以使用聚合:

1
2
3
4
5
6
7
8
User.findAll({
attributes: {
include: [
[sequelize.fn('COUNT', sequelize.col('hats')), 'n_hats']
]
}
})
SELECT name, age, ..., hats, COUNT(hats) AS n_hats FROM User;

  同时,也可以排除部分属性:

1
2
3
4
5
6
7
8
9
User.findAll({
attributes: {
include: [
[sequelize.fn('COUNT', sequelize.col('hats')), 'n_hats']
],
exclude: ['age']
}
})
SELECT name, ..., hats, COUNT(hats) AS n_hats FROM User;
(2)应用 WHERE 子句

  where 用于过滤查询,where有很多运算符,可以从Op中以 Symbols 的形式使用。

1
2
3
4
5
6
7
User.findAll({
where: {
name: 'Tom',
age: 20
}
})
SELECT * FROM User WHERE name = 'TOM' AND age = 20;

  OR

1
2
3
4
5
6
7
8
9
10
const { Op } = require('sequelize')
User.findAll({
where: {
[Op.or]: [
{ name: 'Tom' },
{ age: 20' }
]
}
})
SELECT * FROM User WHERE name = 'TOM' OR age = 20;

  IN

1
2
3
4
5
6
7
const { Op } = require('sequelize')
User.findAll({
where: {
name: ['Tom', 'Mary'] // 等同于:name: { [Op.or]: ['Tom', 'Mary'] }
}
})
SELECT * FROM User WHERE name = 'TOM' OR age = 20;

  更多Op操作符参见文档:操作符

(3)排序和分组

  排序和分组

(4)限制和分页

  使用limitoffset参数可以进行限制和分页,通常与order排序一起使用:

1
2
3
4
5
6
7
8
// 提取10行
User.findAll({ limit: 10 })

// 跳过8行
User.findAll({ offset: 8 })

// 跳过5行,然后获取5行
User.findAll({ offset: 5, limit: 5 })
(5)返回原始数据

  默认情况下,返回的是模型类的实例,这意味着在数据库返回结果之后,Sequelize 会自动将所有内容包装在适当的实例对象中。当结果太多时,这种包装可能会效率低下,要禁用此包装并收到简单的响应,请将{ raw: true }作为参数传递给方法。

1
2
// 增加 raw 选项后,会返回数据库中的原始结果
User.findAll({ where: { ... }, raw: true })

2、count

1
2
3
4
5
6
// 查询 age = 20 的用户数量
const total = await User.count({
where: {
age: 20
}
})

3、findByPk

  findByPk方法使用提供的主键从表中仅获得一行数据:

1
const user = await User.findByPk(1024) // 主键的值是 1024

4、findOne

  findOne方法获得它找到的第一行数据:

1
const user = await User.findOne({ where: { name: 'Tom' } })

5、findOrCreate

  除非找到一个满足查询参数的结果,否则findOrCreate将在表中创建一行。具体参考:findOrCreate

6、findAndCountAll推荐

  结合了findAllcount的便捷方法。具体参考:findAndCountAll。findAndCountAll 方法返回有两个属性的对象:

  • count —— 整数,符合查询条件的记录总数
  • rows —— 数组对象,获得的记录
1
2
3
4
5
6
7
8
9
10
11
const { count, rows } = await User.findAndCountAll({
where: {
name: {
[Op.like]: 'T%'
}
},
offset: 10,
limit: 2
})
console.log(count)
console.log(rows)

二、作用域

  作用域用于帮助复用代码

以上

随笔标题:Sequelize 中常用的一些方法和参数

随笔作者:刘先玉

发布时间:2020年12月17日 - 09:52:01

最后更新:2020年12月17日 - 09:52:01

原文链接:https://liuxianyu.cn/article/sequelize-function.html