前言:
最近写的一个接口需要用到子查询,并且子查询的结果并不是可以在另外一个查询语句中直接当作in的选项,没办法区sequelize官网上看了一下如何直接使用原生语句
sequelize文档内容翻译
看一段官网中代码例子,一一说明
//1sequelize.query('SELECT 1', { logging: console.log, plain: false, raw: false, type: Sequelize.QueryTypes.SELECT})//2sequelize .query('SELECT * FROM projects', { raw: true }) .then(projects => { console.log(projects) })//3sequelize.query('SELECT * FROM projects WHERE status = ?', { replacements: ['active'], type: sequelize.QueryTypes.SELECT }).then(projects => { console.log(projects)})//4sequelize.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变量是从前端请求获取的参数值,是一个变量哦
附件:
官网中原生语句查询地址:
欢迎大家关注我的公众号——程序员成长指北。请自行微信搜索——“程序员成长指北”