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