此係列文章的應用示例已發佈於 GitHub: sequelize-docs-Zh-CN. 能夠 Fork 幫助改進或 Star 關注更新. 歡迎 Star.git
因爲經常使用簡單的方式來執行原始/已經準備好的SQL查詢,因此可使用 sequelize.query
函數。github
默認狀況下,函數將返回兩個參數 - 一個結果數組,以及一個包含元數據(受影響的行等)的對象。 請注意,因爲這是一個原始查詢,因此元數據(屬性名稱等)是具體的方言。 某些方言返回元數據 "within" 結果對象(做爲數組上的屬性)。 可是,將永遠返回兩個參數,但對於MSSQL和MySQL,它將是對同一對象的兩個引用。數據庫
sequelize.query("UPDATE users SET y = 42 WHERE x = 12").spread((results, metadata) => { // 結果將是一個空數組,元數據將包含受影響的行數。 })
在不須要訪問元數據的狀況下,您能夠傳遞一個查詢類型來告訴後續如何格式化結果。 例如,對於一個簡單的選擇查詢你能夠作:數組
sequelize.query("SELECT * FROM `users`", { type: sequelize.QueryTypes.SELECT}) .then(users => { // 咱們不須要在這裏延伸,由於只有結果將返回給選擇查詢 })
還有其餘幾種查詢類型可用。 詳細瞭解來源函數
第二種選擇是模型。 若是傳遞模型,返回的數據將是該模型的實例。code
// Callee 是模型定義。 這樣您就能夠輕鬆地將查詢映射到預約義的模型 sequelize.query('SELECT * FROM projects', { model: Projects }).then(projects => { // 每一個記錄如今將是Project的一個實例 })
查詢中的替換能夠經過兩種不一樣的方式完成:使用命名參數(以:
開頭),或者由?
表示的未命名參數。 替換在options對象中傳遞。對象
?
將按照它們在數組中出現的順序被替換:key
將替換爲該對象的鍵。 若是對象包含在查詢中找不到的鍵,則會拋出異常,反之亦然。sequelize.query('SELECT * FROM projects WHERE status = ?', { replacements: ['active'], type: sequelize.QueryTypes.SELECT } ).then(projects => { console.log(projects) }) sequelize.query('SELECT * FROM projects WHERE status = :status ', { replacements: { status: 'active' }, type: sequelize.QueryTypes.SELECT } ).then(projects => { console.log(projects) })
數組替換將自動處理,如下查詢將搜索狀態與值數組匹配的項目。get
sequelize.query('SELECT * FROM projects WHERE status IN(:status) ', { replacements: { status: ['active', 'inactive'] }, type: sequelize.QueryTypes.SELECT } ).then(projects => { console.log(projects) })
要使用通配符運算符 %,請將其附加到你的替換中。 如下查詢與名稱以「ben」開頭的用戶相匹配。sequelize
sequelize.query('SELECT * FROM users WHERE name LIKE :search_name ', { replacements: { search_name: 'ben%' }, type: sequelize.QueryTypes.SELECT } ).then(projects => { console.log(projects) })
綁定參數就像替換。 除非替換被轉義並在查詢發送到數據庫以前經過後續插入到查詢中,而將綁定參數發送到SQL查詢文本以外的數據庫。 查詢能夠具備綁定參數或替換。it
只有SQLite和PostgreSQL支持綁定參數。 其餘方言會將它們插入到SQL查詢中,就像替換同樣。 綁定參數由 $1, $2, ... (numeric)
或 $key (alpha-numeric)
引用。這是獨立於方言。
$1
被綁定到數組中的第一個元素 (bind[0]
)。$key
綁定到 object['key']
。 每一個鍵必須以非數字字符開始。 $1
不是一個有效的鍵,即便 object['1']
存在。$$
能夠用來轉義一個 $
字符符號.數組或對象必須包含全部綁定的值,或者Sequelize將拋出異常。 這甚至適用於數據庫可能忽略綁定參數的狀況。
數據庫可能會增長進一步的限制。 綁定參數不能是SQL關鍵字,也不能是表或列名。 引用的文本或數據也忽略它們。 在PostgreSQL中,若是不能從上下文 $1::varchar
推斷類型,那麼也可能須要對其進行類型轉換。
sequelize.query('SELECT *, "text with literal $$1 and literal $$status" as t FROM projects WHERE status = $1', { bind: ['active'], type: sequelize.QueryTypes.SELECT } ).then(projects => { console.log(projects) }) sequelize.query('SELECT *, "text with literal $$1 and literal $$status" as t FROM projects WHERE status = $status', { bind: { status: 'active' }, type: sequelize.QueryTypes.SELECT } ).then(projects => { console.log(projects) })
若是這篇文章對您有幫助, 感謝 下方點贊 或 Star GitHub: sequelize-docs-Zh-CN 支持, 謝謝.