Sequelize 是基于 Node 的 ORM 库, 支持的数据库有 Postgres | MySQL | MariaDB, SQLite | Microsoft SQL Server.
Sequelize 将数据库键值对映射成对象, 将增删改查操作映射成方法,抹平了不同数据库间的语法区别.
hello world
安装 Sequelize
1 | yarn add sequelize |
hello world
1 | const Sequelize = require("sequelize"); |
创建表
Sequelize 会自动添加 createdAt 和 updatedAt, 分别对应创建时间和更新时间.可通过设置 timestamps: false 禁止自动添加 createdAt 和 updatedAt.
1 | db.define("user", {}, { timestamps: false }); |
新增数据
create
新增数据, 创建一个 model 并调用 save. Model | Sequelize
1 | const anna = await userTable.create({ |
可通过修改这个返回的 model 来更新表中所对应的数据
1 | anna.age = 25; |
bulkCreate
批量新增, 返回一个数组,包含一组表示映射关系的 model. Model | Sequelize
1 | const user = [{ name: "anna", age: 20 }, { name: "bob", age: 25 }]; |
findOrCreate
没有找到对应值则新增,有则不不做任何更改.
返回一个数组, 其中包含一个表示映射关系的 model,和一个表示是否是新增数据的布尔值.
查找 name: "anna" 是否存在, 不存在时用 defaults 参数中的值新建.
1 | const [anna, isCreate] = await userTable.findOrCreate({ |
修改数据
update
更新数据, 必须提供属性 where. Model | Sequelize
返回一个数组,包含两个数值.第一个数值为修改行数, 第二个值为实际影响的行数(? 仅支持 postgres )
1 | const updateInfo = await userTable.update( |
upsert
符合条件则修改该行数据, 未找到则新增一行数据. Model | Sequelize
返回一个布尔值, 表示该操作是新增还是修改.(不同数据库的返回值各不相同, sqlite 不返回任何值, 详见官方文档).
upsert 只根据参数的 主键/设置了唯一标识( unique: true) 来判断是否更新某行, 不支持 where.
务必要保证提供了 主键(例如 id)/设置了唯一标识的参数
1 | await userTable.upsert({ name: "liam", age: 25, id: 1 }); |
错误示例, 只会插入一行新数据:
1 | const liam = userTable.build({ |
查询数据
findAll
获取多行数据,可用 where 参数设置查询条件.
返回一个数组, 包含匹配到的 model.未找到到时返回空数组.
返回所有数据:
1 | const findList = await userTable.findAll(); |
使用 where 设置过滤条件:
1 | const findList = await userTable.findAll({ |
可通过 limit 设置返回的行数
只返回一条记录:
1 | const findList = await userTable.findAll({ limit: 1 }); |
设置排序,其中的 ASC 表示升序, DESC 表示降序
按 name 降序排列. 如果 name 值相同, 则相同值按 age 升序排列:
1 | const findList = await userTable.findAll({ |
设置偏移量(起始位置):
1 | await userTable.findAll({ offset: 2 }); |
findAndCountAll
类似 findAll, 同样支持 where offset limit order 等参数.
区别为除了返回匹配到的数据之外,还返回所匹配的行数.
其返回一个对象, 其包含两个属性: count 和 rows.
count 为匹配数据的总数, 受 where 影响, 但不受 offset limit 影响.
rows 为匹配到的数据(即 findAll 的返回值).
1 | let findInfo = await userTable.findAndCountAll(); |
通过 limit offset 实现分页功能:
1 | /* |
findByPk
通过主键获取数据, 未找到时返回 null.
1 | const model = await userTable.findByPk(1); |
findOne
返回找到的第一个 model,相当于 findAll({limit: 1}).
未找到时返回 null.
1 | const model = await userTable.findOne(); |
1 | const model = await userTable.findOne({ |
count
返回匹配的记录行数
1 | const count = await userTable.count(); |
使用 where 参数过滤匹配条件
1 | const count = await userTable.count({ |
删除数据
destroy
删除匹配的记录, 必须提供 where 参数.
返回一个数值,表示删了几行.
1 | const count = await userTable.destroy({ |
Model
Model 实例是对表行的映射
1 | // 创建 model |
对于某些类型(例如 Sequelize.JSON), 只调用 model.save 可能不起作用.
需要在 调用 save 方法前 调用 changed(key name, true) 方法.
1 | model.changed("value", true); |
option 参数
where
sequelize-docs-Zh-CN/querying.md at v5 · demopark/sequelize-docs-Zh-CN · GitHub
获取字段 name 值为 anna 的所有记录
1 | const findList = await userTable.findAll({ where: { name: "anna" } }); |
where 还支持运算符操作 sequelize-docs-Zh-CN/querying.md at v5 · demopark/sequelize-docs-Zh-CN · GitHub
先载入 Op 对象
1 | const Op = Sequelize.Op; |
或操作,返回所有 name 值为 anna 或 ava 的记录
1 | const findList = await userTable.findAll({ |
另一种写法
1 | const findList = await userTable.findAll({ |
返回所有年龄在范围 [20, 25] 内的记录
1 | const findList = await userTable.findAll({ |
返回 name 值包含 an 字母的记录
1 | const findList = await userTable.findAll({ |
返回 name 值含有字母 a, 或 age 值为 20 的记录
1 | const findModel = await userTable.findAll({ |
order
sequelize-docs-Zh-CN/querying.md at v5 · demopark/sequelize-docs-Zh-CN · GitHub