由于常常使用簡單的方式來執(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
}
)