持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第8天,点击查看活动详情
概述
最近学习 Nodejs ,发现 Sequelize 很好使用,在这里记录一下相关学习,希望能给有相同需要的同学一些帮助,也希望能够相互交流一下各自的学习经验,如果有写的不对的地方,希望可以指正,如果觉得写的可以,可以给我点个赞,谢谢!
正文
偏执表
Sequelize 支持 paranoid 表的概念,必须将 paranoid: true 参数传递给模型定义. Paranoid 需要时间戳才能起作用(即,如果你传递 timestamps: false 了,paranoid 将不起作用)
这意味着删除记录时不会真的删除,而是给字段deletedAt值设置为时间戳 删除的时候默认是软删除,而不是硬删除
class Post extends Model {}
Post.init({ /* 这是属性 */ }, {
sequelize,
paranoid: true,// 传递参数,创建偏执表
// 如果要为 deletedAt 列指定自定义名称
deletedAt: 'destroyTime'
});
但是如果要强制删除,可以这样
await Post.destroy({
where: {
id: 1
},
force: true //硬删除
});
如果想要恢复软删除,可以执行下面的操作
post.restore();
Post.restore({
where: {
likes: {
[Op.gt]: 100
}
}
});
如果你有查询软删除的需求,我们也可以执行这样的操作
await Post.findAll({
where: { foo: 'bar' },
paranoid: false
});
关联查询
Sequelize 提供了两种一对一关系关联方法 bleongsTo 和 haisOne
- belongsTo暴露出的是User表的‘id’字段作为外键去查询UserInfo表
- hasOne方法暴露的是Article表的‘user_id’作为外键查询User表
User.belongsTo(Article, { foreignKey: 'id', as: 'article',targetKey:'user_id'})
User.hasOne(Article, { foreignKey: 'user_id', as: 'article'})
第一个参数为一个 Model,第二个位 options 配置,
- foreignKey:制定外键
- as: 指定别名
- targetKey:目标键,指的是源模型上的外键列指向的目标模型上的列,默认情况下是目标模型的主键,两种方法都是把 userInfo 表关联到 Article 表,区别是暴露外键的表不同
一对多查询
hasMany
多对多
const Op = Sequelize.Op;
//查询age < 18 或者小于5的数据
User.findAll({
where: {
age:{
[Op.or]: {
[Op.lt]: 18,
[Op.eq]: 5
}
}
}
}).then(result => {
console.log(result)
}).catch(err => {
console.log(err)
});