最近 koa2 项目中用到的 ORM 是 Sequelize V6,记录一下相关知识点。
Sequelize 中文文档、Sequelize 中文API文档-2. Model 的定义、使用与Model类的API
¶一、常用方法
¶1、findAll
findAll 从数据库读取整个表:
1 | const user = await User.findAll() |
¶(1)SELECT 特定属性attributes
选择某些特定属性,可以使用attributes
参数:
1 | User.findAll({ |
可以使用嵌套数组来重命名属性:
1 | User.findAll({ |
可以使用sequelize.fn
进行聚合。使用聚合函数时,必须为它提供一个别名,以便能够从 Model 中访问它。在下面的示例中,可以通过instance.n_hats
获取帽子数量:
1 | User.findAll({ |
不用列出所有属性,也可以使用聚合:
1 | User.findAll({ |
同时,也可以排除部分属性:
1 | User.findAll({ |
¶(2)应用 WHERE 子句
where
用于过滤查询,where
有很多运算符,可以从Op
中以 Symbols 的形式使用。
1 | User.findAll({ |
OR
1 | const { Op } = require('sequelize') |
IN
1 | const { Op } = require('sequelize') |
更多Op
操作符参见文档:操作符
¶(3)排序和分组
¶(4)限制和分页
使用limit
和offset
参数可以进行限制和分页,通常与order
排序一起使用:
1 | // 提取10行 |
¶(5)返回原始数据
默认情况下,返回的是模型类的实例,这意味着在数据库返回结果之后,Sequelize 会自动将所有内容包装在适当的实例对象中。当结果太多时,这种包装可能会效率低下,要禁用此包装并收到简单的响应,请将{ raw: true }
作为参数传递给方法。
1 | // 增加 raw 选项后,会返回数据库中的原始结果 |
¶2、count
1 | // 查询 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推荐
结合了findAll
和count
的便捷方法。具体参考:findAndCountAll。findAndCountAll 方法返回有两个属性的对象:
- count —— 整数,符合查询条件的记录总数
- rows —— 数组对象,获得的记录
1 | const { count, rows } = await User.findAndCountAll({ |