goodBlog
goodBlog copied to clipboard
sequelize如何使用原生语句
前言:
最近写的一个接口需要用到子查询,并且子查询的结果并不是可以在另外一个查询语句中直接当作in的选项,没办法区sequelize官网上看了一下如何直接使用原生语句
sequelize文档内容翻译
看一段官网中代码例子,一一说明
//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:正在执行的查询的类型(也可以is hi更新哦,具体哪些去看官网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
})
sequelize原生语句具体使用实例
看一段我在开发过程中怎么使用的原生语句查询 代码如下:
let sqlRank = `SELECT userspk.avatar AS user_avatar,
userspk.gender AS user_gender,
userspk.nickname AS user_nickname,
a.id AS pk_record_id,
a.user_id,
a.answer_record,
a.pk_type,
MAX(score) AS score,
a.create_time
FROM (select * from pkrecord order by score desc,create_time asc) as a
INNER JOIN userspk AS userspk
ON a.user_id = userspk.user_id
WHERE a.status = 1
AND a.pk_type = 'noreal'
AND a.subject_id = :subject_id
GROUP BY user_id
ORDER BY a.score DESC
LIMIT 3;`
let pkRankResult= await ctx.main.query(sqlRank, {
replacements: {
subject_id: subject_id,
},
type: Sequelize.QueryTypes.SELECT }
);
注意 replacements中的subject_id变量是从前端请求获取的参数值,是一个变量哦
附件:
官网中原生语句查询地址: http://docs.sequelizejs.com/manual/raw-queries.html