egg-sequelize文档 https://www.eggjs.org/zh-CN/tutorials/sequelize
统一以 UserModel为例,来做增删查改
create新增
Model.create 相当于 build save两步合并
const now = Date.now();
const user = await UserModel.create({
id: 1, username: 'lucy', createdAt: now, updatedAt: now
});
bulkCreate批量新增
默认不会运行验证器,需要手动开启
User.bulkCreate(
[
{ username: 'foo' },
{ username: 'bar', admin: true }
],
{
validate: true, // 手动开启验证器
fields: ['username'] // 限制字段
}
);
// 因为限制了字段只存username,foo 和 bar 都不会是管理员
find查询
- include 参数对应sql的join连接操作
- findAll 查找所有的
- findByPk 根据主键查找
- findOne 找到第一个实例
- findOrCreate 查找到或创建实例
- findCreateFind
- findAndCountAll 分页查找
findAll
const allUser = await UserModel.findAll();
// 条件查找
const allUser = await UserModel.findAll({
where: {
name: {$like: '%lu%'}, // 模糊查询
status: 1, // 精确查询
},
});
findAndCountAll分页查询
// 分页查找
const page = 1, // 页码
const limit = 10; // 每页显示多少条数据,默认 10
const allUser = await UserModel.findAndCountAll({
where: {
name: {$like: '%lu%'}, // 模糊查询
status: 1, // 精确查询
limit,
offset: limit * (page-1),
},
});
findOne
const oneUser = await UserModel.findOne(id)
findByPk
const oneUser = await UserModel.findByPk(23)
count,max, min,sum
update更新
Model.update
相当于 set, save两步合并,通常就直接修改实例属性,然后save()更新
data 里面如果带有 id 则更新,不带则新建
// 01
await UserModel.update({id: 1, username: 'lucy'});
// 02
const user = await UserModel.findById(id);
user.update(data);
await UserModel.update({
name: 'lucy'
}, {
where: {name: 'lily'}
})
部分更新
通过传递一个列名数组,可以定义在调用 save 时应该保存哪些属性
save({fields:[ ‘name’,… ]}) 只更新数组里面的字段
upsert
destroy删除
Model.destroy
// 01
await UserModel.destroy({
where: { username: 'lucy' },
});
// 02
const user = await UserModel.findById(id);
user.destroy();
paranoid软删除
Sequelize 支持 paranoid 表的概念,这意味着删除记录时不会真的删除,
- 而是给字段deletedAt值设置为时间戳
- 删除的时候默认是软删除,而不是硬删除
查询包含软删除的记录
await UserModel.findAll({
where: { id: 1 },
paranoid: false
});
restore恢复软删除
UserModel.restore();
UserModel.restore({
where: {
likes: {
[Op.gt]: 100
}
}
});
force硬删除
force: true 强制删除
await Post.destroy({
where: { id: 1 },
force: true // 硬删除
});
reload重载
Model.reload