Sequelize 中文文檔 v4 - Raw queries - 原始查詢

Raw queries - 原始查詢

此係列文章的應用示例已發佈於 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 支持, 謝謝.

相關文章
相關標籤/搜索