Sequelize Model Querying - Finders - 模型查询(查找器)及批量新增或批量更新(bulkCreate的updateOnDuplicate)等常用接口


一、查询

  Finder 方法是生成 SELECT 查询的方法.

  默认情况下,所有 finder 方法的结果都是模型类的实例(与普通的 JavaScript 对象相反). 这意味着在数据库返回结果之后,Sequelize 会自动将所有内容包装在适当的实例对象中. 在少数情况下,当结果太多时,这种包装可能会效率低下. 要禁用此包装并收到简单的响应,请将 { raw: true } 作为参数传递给 finder 方法.

  查询分为全部查询数据,根据条件查询,全部查询数据及条数(分页),查询特一数据。

1、findAll

  在上一教程中已经知道 findAll 方法. 它生成一个标准的 SELECT 查询,该查询将从表中检索所有条目(除非受到 where 子句的限制).

2、findByPk 方法使用提供的主键从表中仅获得一个条目.

const project = await Project.findByPk(123); if (project === null) { console.log('Not found!'); } else { console.log(project instanceof Project); // true // 它的主键是 123
}

3、findOne 方法获得它找到的第一个条目(它可以满足提供的可选查询参数).

const project = await Project.findOne({ where: { title: 'My Title' } }); if (project === null) { console.log('Not found!'); } else { console.log(project instanceof Project); // true
  console.log(project.title); // 'My Title'
}

4、根据条件查询数据及条数(分页使用

  findAndCountAll 方法是结合了 findAllcount 的便捷方法. 在处理与分页有关的查询时非常有用,在分页中,你想检索带有 limitoffset 的数据,但又需要知道与查询匹配的记录总数.

  findAndCountAll 方法返回一个具有两个属性的对象:

  • count - 一个整数 - 符合查询条件的记录总数
  • rows - 一个数组对象 - 获得的记录
const { count, rows } = await Project.findAndCountAll({ where: { title: { [Op.like]: 'foo%' } }, offset: 10, limit: 2 }); console.log(count); console.log(rows);

  下面这个语句查询出来的数据包含了数据总条数,可以用来设置分页。offset是偏移数,limit为每页数量

let data = await B.m.db.history.findAndCountAll({ where:{ name:{ [Op.like]:`%${crb.name}%` }, status:{ [Op.in]:crb.status } }, order:[ ['id',crb.sort] ], offset: (crb.currPage - 1) * (crb.pageSize), limit: crb.pageSize, });

  返回count为总数,rows为查询的pageSize list数据

5、查询插入findOrCreate

  除非找到一个满足查询参数的结果,否则方法 findOrCreate 将在表中创建一个条目. 在这两种情况下,它将返回一个实例(找到的实例或创建的实例)和一个布尔值,指示该实例是已创建还是已经存在.

  使用 where 参数来查找条目,而使用 defaults 参数来定义必须创建的内容. 如果 defaults 不包含每一列的值,则 Sequelize 将采用 where 的值(如果存在).

  假设我们有一个空的数据库,该数据库具有一个 User 模型,该模型具有一个 username 和一个 job.

const [user, created] = await User.findOrCreate({ where: { username: 'sdepold' }, defaults: { job: 'Technical Lead JavaScript' } }); console.log(user.username); // 'sdepold'
console.log(user.job); // 这可能是也可能不是 'Technical Lead JavaScript'
console.log(created); // 指示此实例是否刚刚创建的布尔值
if (created) { console.log(user.job); // 这里肯定是 'Technical Lead JavaScript'
}

二、新增数据

  传入需要新增的数据,使用create方法即可

await history .create({ dt: momentTime, username: crb.username, mail: crb.mail, })

三、修改数据

  根据id修改数据,需要同时传入数据及数据特征(寻找需要修改的数据)。

let data = await template.update({ name: crb.name, keyword: crb.keyword, owner: crb.owner, update_time: momentTime, update_commit: crb.update_commit },{ where:{ id: crb.id } });

  其实新增和编辑通常都是合在一起写保存接口

  if (crb.id) { await model.foods_info.update(crb, { where: { id: crb.id } }) } else { await model.foods_info.create(crb) } return ctx.response.body={ success: true, msg: '保存成功' }

四、批量新增或批量更新(bulkCreate的updateOnDuplicate)

  说明:如果id存在,则update,否则insert

  updateOnDuplicate:true

let obj1 = { id:0, name: "园区问卷调查" }; let obj2 = { id:1, name: "园区问卷调查ddddddddddddddddddddd" }; let obj_list = [obj1, obj2]; uc_survey.bulkCreate(obj_list , {updateOnDuplicate:true}).then(result => { result.forEach(item => { console.log("item:",item) }); }).catch(err => { console.log("err:",err) });

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM