Sequelize的日常使用(2)

351 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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 提供了两种一对一关系关联方法 bleongsTohaisOne

  • 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)
});