本篇文章于 2020-12-17 初次写在我的个人小站,链接:
liuxianyu.cn/article/seq…
最近 koa2 项目中用到的 ORM 是 Sequelize V6,记录一下相关知识点。
Sequelize 中文文档
、
Sequelize 中文API文档-2. Model 的定义、使用与Model类的API
一、常用方法
1、findAll
findAll 从数据库读取整个表:
const user = await User.findAll()
SELECT * FROM User;
(1)SELECT 特定属性 attributes
选择某些特定属性,可以使用 attributes
参数:
User.findAll({
attributes: ['name', 'age']
SELECT name, age FROM User;
可以使用嵌套数组来重命名属性:
User.findAll({
attributes: ['name', ['age', 'ageage'], 'hats']
SELECT name, age AS ageage, hats FROM User;
可以使用 sequelize.fn
进行聚合。使用聚合函数时,必须为它提供一个别名,以便能够从 Model 中访问它。在下面的示例中,可以通过 instance.n_hats
获取帽子数量:
User.findAll({
attributes: [
'name',
[sequelize.fn('COUNT', sequelize.col('hats')), 'n_hats'],
'age'
SELECT name, COUNT(hats) AS n_hats, age FROM User;
不用列出所有属性,也可以使用聚合:
User.findAll({
attributes: {
include: [
[sequelize.fn('COUNT', sequelize.col('hats')), 'n_hats']
SELECT name, age, ..., hats, COUNT(hats) AS n_hats FROM User;
同时,也可以排除部分属性:
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 的形式使用。
User.findAll({
where: {
name: 'Tom',
age: 20
SELECT * FROM User WHERE name = 'TOM' AND age = 20;
const { Op } = require('sequelize')
User.findAll({
where: {
[Op.or]: [
{ name: 'Tom' },
{ age: 20' }
SELECT * FROM User WHERE name = 'TOM' OR age = 20;
const { Op } = require('sequelize')
User.findAll({
where: {
name: ['Tom', 'Mary']
SELECT * FROM User WHERE name = 'TOM' OR age = 20;
更多Op
操作符参见文档:操作符
(3)排序和分组
排序和分组
(4)限制和分页
使用 limit
和 offset
参数可以进行限制和分页,通常与 order
排序一起使用:
User.findAll({ limit: 10 })
User.findAll({ offset: 8 })
User.findAll({ offset: 5, limit: 5 })
(5)返回原始数据
默认情况下,返回的是模型类的实例,这意味着在数据库返回结果之后,Sequelize 会自动将所有内容包装在适当的实例对象中。当结果太多时,这种包装可能会效率低下,要禁用此包装并收到简单的响应,请将 { raw: true }
作为参数传递给方法。
User.findAll({ where: { ... }, raw: true })
2、count
const total = await User.count({
where: {
age: 20
3、findByPk
findByPk
方法使用提供的主键从表中仅获得一行数据:
const user = await User.findByPk(1024)
4、findOne
findOne
方法获得它找到的 第一行
数据:
const user = await User.findOne({ where: { name: 'Tom' } })
5、findOrCreate
除非找到一个满足查询参数的结果,否则 findOrCreate
将在表中创建一行。具体参考:findOrCreate
6、findAndCountAll推荐
结合了 findAll
和 count
的便捷方法。具体参考:findAndCountAll。findAndCountAll 方法返回有两个属性的对象:
count —— 整数,符合查询条件的记录总数
rows —— 数组对象,获得的记录
const { count, rows } = await User.findAndCountAll({
where: {
name: {
[Op.like]: 'T%'
offset: 10,
limit: 2
console.log(count)
console.log(rows)