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函数的第二个参数,是一个对象,对象里面几个常用参数进行说明。
- pain:如果plain为真,那么sequelize只返回第一个记录结果集。如果为false,则返回所有记录。
- type:正在执行的查询的类型(具体哪些去看官网api)。查询类型影响返回结果之前的格式化方式。
- raw:查询对类型是否有模型定义,如果您的查询没有模型定义,请将此设置为true。
- logging: console.log记录查询的函数,是否会为发送的每个SQL查询调用到服务器。
-
对于查找条件where后面的字段
- 如果传递数组,? 将按它们在数组中出现的顺序进行替换。
- 如果传递了一个对象,: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
})
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律