sequelize使用原生sql語句Raw Queries - 原始查詢


  由於常常使用簡單的方式來執行原始/已經准備好的SQL查詢,因此可以使用 sequelize.query 方法.

  默認情況下,函數將返回兩個參數 - 一個結果數組,以及一個包含元數據(例如受影響的行數等)的對象. 請注意,由於這是一個原始查詢,所以元數據都是具體的方言. 某些方言返回元數據 "within" 結果對象(作為數組上的屬性). 但是,將永遠返回兩個參數,但對於MSSQL和MySQL,它將是對同一對象的兩個引用.

const [results, metadata] = await sequelize.query("UPDATE users SET y = 42 WHERE x = 12"); // 結果將是一個空數組,元數據將包含受影響的行數.

  在不需要訪問元數據的情況下,你可以傳遞一個查詢類型來告訴后續如何格式化結果. 例如,對於一個簡單的選擇查詢你可以做:

const { QueryTypes } = require('sequelize'); const users = await sequelize.query("SELECT * FROM `users`", { type: QueryTypes.SELECT }); // 我們不需要在這里分解結果 - 結果會直接返回

  還有其他幾種查詢類型可用. 詳細了解來源

  第二種選擇是模型. 如果傳遞模型,返回的數據將是該模型的實例.

// Callee 是模型定義. 這樣你就可以輕松地將查詢映射到預定義的模型
const projects = await sequelize.query('SELECT * FROM projects', { model: Projects, mapToModel: true // 如果你有任何映射字段,則在此處傳遞 true
}); // 現在,`projects` 的每個元素都是 Project 的一個實例

  查看 Query API 參考中的更多參數. 以下是一些例子:

const { QueryTypes } = require('sequelize'); await sequelize.query('SELECT 1', { // 用於記錄查詢的函數(或false) // 將調用發送到服務器的每個SQL查詢.
 logging: console.log, // 如果plain為true,則sequelize將僅返回結果集的第一條記錄. // 如果是false,它將返回所有記錄.
  plain: false, // 如果你沒有查詢的模型定義,請將此項設置為true.
  raw: false, // 你正在執行的查詢類型. 查詢類型會影響結果在傳回之前的格式.
 type: QueryTypes.SELECT }); // 注意第二個參數為null! // 即使我們在這里聲明了一個被調用對象, // raw: true 也會取代並返回一個原始對象.
 console.log(await sequelize.query('SELECT * FROM projects', { raw: true }));

"Dotted" 屬性 和 nest 參數

  如果表的屬性名稱包含點,則可以通過設置 nest: true 參數將生成的對象變為嵌套對象. 這可以通過 dottie.js 在后台實現. 見下文:

1、不使用 nest: true:

const { QueryTypes } = require('sequelize'); const records = await sequelize.query('select 1 as `foo.bar.baz`', { type: QueryTypes.SELECT }); console.log(JSON.stringify(records[0], null, 2));
{ "foo.bar.baz": 1 }

2、使用 nest: true:

const { QueryTypes } = require('sequelize'); const records = await sequelize.query('select 1 as `foo.bar.baz`', { nest: true, type: QueryTypes.SELECT }); { "foo": { "bar": { "baz": 1 } } }

替換

  查詢中的替換可以通過兩種不同的方式完成:使用命名參數(以:開頭),或者由表示的未命名參數. 替換在options對象中傳遞.

  • 如果傳遞一個數組, ? 將按照它們在數組中出現的順序被替換
  • 如果傳遞一個對象, :key 將替換為該對象的鍵. 如果對象包含在查詢中找不到的鍵,則會拋出異常,反之亦然.

  要使用通配符運算符 ,請將其附加到你的替換中. 以下查詢與名稱以 'ben' 開頭的用戶相匹配.

const { QueryTypes } = require('sequelize'); await sequelize.query( 'SELECT * FROM users WHERE name LIKE :search_name', { replacements: { search_name: 'ben%' }, type: QueryTypes.SELECT } );

總結

  看一段官網中代碼例子,說明

//1
sequelize.query('SELECT 1', { logging: console.log, plain: false, raw: false, type: Sequelize.QueryTypes.SELECT }) //2
sequelize .query('SELECT * FROM projects', { raw: true }) .then(projects => { console.log(projects) }) //3
sequelize.query('SELECT * FROM projects WHERE status = ?', { replacements: ['active'], type: sequelize.QueryTypes.SELECT } ).then(projects => { console.log(projects) }) //4
sequelize.query('SELECT * FROM projects WHERE status = :status ', { replacements: { status: 'active' }, type: sequelize.QueryTypes.SELECT } ).then(projects => { console.log(projects) })
  • sequelize中提供了query函數,用於直接操作原生語句

  • 該函數將返回兩個參數:結果數組和包含元數據的對象,對於mysql將是返一對象的兩個引用。

  • query函數的第二個參數,是一個對象,對象里面幾個常用參數進行說明。

    1. pain:如果plain為真,那么sequelize只返回第一個記錄結果集。如果為false,則返回所有記錄。
    2. type:正在執行的查詢的類型(具體哪些去看官網api)。查詢類型影響返回結果之前的格式化方式。
    3. raw:查詢對類型是否有模型定義,如果您的查詢沒有模型定義,請將此設置為true。
    4. logging: console.log記錄查詢的函數,是否會為發送的每個SQL查詢調用到服務器。
  • 對於查找條件where后面的字段

    1. 如果傳遞數組,? 將按它們在數組中出現的順序進行替換。
    2. 如果傳遞了一個對象,:key則將替換該對象中的鍵。如果對象包含查詢中未找到的鍵,會拋出查詢異常。
  • 對於替換where后面的變量,也可以使用 in 關鍵字從數組匹配,也可以使用通配符 like% 等。代碼如下:

    //in關鍵字使用官網例子
    sequelize.query('SELECT * FROM projects WHERE status IN(:status) ', { replacements: { status: ['active', 'inactive'] }, type: sequelize.QueryTypes.SELECT } ).then(projects => { console.log(projects) }) //like通配符關鍵字使用官網例子
    sequelize.query('SELECT * FROM users WHERE name LIKE :search_name ', { replacements: { search_name: 'ben%' }, type: sequelize.QueryTypes.SELECT } ).then(projects => { console.log(projects) })
  • 查詢的時候還可以直接傳遞model,如果傳遞模型,則返回的數據將是該模型的實例,上面其它字段也可以在這使用

sequelize .query('SELECT * FROM projects', { model: Projects, mapToModel: true // 如果有任何映射字段,則在這里傳遞true
 }) .then(projects => { // Each record will now be an instance of Project
  })

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM