原始查詢

由于常常使用簡單的方式來執(zhí)行原始/已經(jīng)準備好的SQL查詢张峰,因此可以使用 sequelize.query 方法砰左。

默認情況下串慰,函數(shù)將返回兩個參數(shù) - 一個結(jié)果數(shù)組栋盹,以及一個包含元數(shù)據(jù)(例如受影響的行數(shù)等)的對象绞灼。

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

在不需要訪問元數(shù)據(jù)的情況下利术,你可以傳遞一個查詢類型來告訴后續(xù)如何格式化結(jié)果。例如低矮,對于一個簡單的選擇查詢你可以做:

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

第二種選擇是模型印叁。如果傳遞模型,返回的數(shù)據(jù)將是該模型的實例军掂。

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

"Dotted" 屬性 和 nest 參數(shù)

如果表的屬性名稱包含點,則可以通過設(shè)置 nest: true 參數(shù)將生成的對象變?yōu)榍短讓ο蠡茸丁_@可以通過 dottie.js 在后臺實現(xiàn)跃洛。

  • 不使用 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
}
  • 使用 nest: true:
const { QueryTypes } = require('sequelize')
const records = await sequelize.query('select 1 as `foo.bar.baz`', {
  nest: true,
  type: QueryTypes.SELECT
})
console.log(JSON.stringify(records[0], null, 2))

// 輸出
{
  "foo": {
    "bar": {
      "baz": 1
    }
  }
}

替換

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

  • 如果傳遞一個數(shù)組,? 將按照它們在數(shù)組中出現(xiàn)的順序被替換
  • 如果傳遞一個對象穴张,:key 將替換為該對象的鍵细燎。 如果對象包含在查詢中找不到的鍵,則會拋出異常皂甘,反之亦然玻驻。
const { QueryTypes } = require('sequelize')

await sequelize.query(
  'SELECT * FROM projects WHERE status = ?',
  {
    replacements: ['active'],
    type: QueryTypes.SELECT
  }
)

await sequelize.query(
  'SELECT * FROM projects WHERE status = :status',
  {
    replacements: { status: 'active' },
    type: QueryTypes.SELECT
  }
)

數(shù)組替換將自動處理,以下查詢將搜索狀態(tài)與值數(shù)組匹配的項目偿枕。

const { QueryTypes } = require('sequelize');

await sequelize.query(
  'SELECT * FROM projects WHERE status IN(:status)',
  {
    replacements: { status: ['active', 'inactive'] },
    type: QueryTypes.SELECT
  }
)

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

const { QueryTypes } = require('sequelize')

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

綁定參數(shù)

綁定參數(shù)就像替換。除非替換被轉(zhuǎn)義并在查詢發(fā)送到數(shù)據(jù)庫之前通過后續(xù)插入到查詢中嗤锉,而將綁定參數(shù)發(fā)送到SQL查詢文本之外的數(shù)據(jù)庫渔欢。查詢可以具有綁定參數(shù)或替換。綁定參數(shù)由 $1档冬,$2膘茎,... (numeric)$key (alpha-numeric) 引用。這是獨立于方言的酷誓。

  • 如果傳遞一個數(shù)組披坏,$1 被綁定到數(shù)組中的第一個元素 (bind[0])。
  • 如果傳遞一個對象盐数,$key 綁定到 object['key']棒拂。每個鍵必須以非數(shù)字字符開始。$1 不是一個有效的鍵玫氢,即使 object['1'] 存在帚屉。
  • 在這兩種情況下 $$ 可以用來轉(zhuǎn)義一個 $ 字符符號。

數(shù)組或?qū)ο蟊仨毎薪壎ǖ闹笛浚蛘逽equelize將拋出異常攻旦。這甚至適用于數(shù)據(jù)庫可能忽略綁定參數(shù)的情況。

數(shù)據(jù)庫可能會增加進一步的限制生逸。綁定參數(shù)不能是SQL關(guān)鍵字牢屋,也不能是表或列名。引用的文本或數(shù)據(jù)也忽略它們槽袄。

const { QueryTypes } = require('sequelize')

await sequelize.query(
  'SELECT *, "text with literal $$1 and literal $$status" as t FROM projects WHERE status = $1',
  {
    bind: ['active'],
    type: QueryTypes.SELECT
  }
)

await sequelize.query(
  'SELECT *, "text with literal $$1 and literal $$status" as t FROM projects WHERE status = $status',
  {
    bind: { status: 'active' },
    type: QueryTypes.SELECT
  }
)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末烙无,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子遍尺,更是在濱河造成了極大的恐慌截酷,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件乾戏,死亡現(xiàn)場離奇詭異迂苛,居然都是意外死亡,警方通過查閱死者的電腦和手機鼓择,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進店門灾部,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人惯退,你說我怎么就攤上這事〈犹伲” “怎么了催跪?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵锁蠕,是天一觀的道長。 經(jīng)常有香客問我懊蒸,道長荣倾,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任骑丸,我火速辦了婚禮舌仍,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘通危。我一直安慰自己铸豁,他們只是感情好,可當我...
    茶點故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布菊碟。 她就那樣靜靜地躺著节芥,像睡著了一般。 火紅的嫁衣襯著肌膚如雪逆害。 梳的紋絲不亂的頭發(fā)上头镊,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天,我揣著相機與錄音魄幕,去河邊找鬼相艇。 笑死,一個胖子當著我的面吹牛纯陨,可吹牛的內(nèi)容都是我干的坛芽。 我是一名探鬼主播,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼队丝,長吁一口氣:“原來是場噩夢啊……” “哼靡馁!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起机久,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤臭墨,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后膘盖,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體胧弛,經(jīng)...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年侠畔,在試婚紗的時候發(fā)現(xiàn)自己被綠了结缚。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,577評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡软棺,死狀恐怖红竭,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤茵宪,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布最冰,位于F島的核電站,受9級特大地震影響稀火,放射性物質(zhì)發(fā)生泄漏暖哨。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一凰狞、第九天 我趴在偏房一處隱蔽的房頂上張望篇裁。 院中可真熱鬧,春花似錦赡若、人聲如沸达布。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽往枣。三九已至,卻和暖如春粉渠,著一層夾襖步出監(jiān)牢的瞬間分冈,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工霸株, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留雕沉,地道東北人。 一個月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓去件,卻偏偏與公主長得像坡椒,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子尤溜,可洞房花燭夜當晚...
    茶點故事閱讀 43,452評論 2 348

推薦閱讀更多精彩內(nèi)容