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函数的第二个参数,是一个对象,对象里面几个常用参数进行说明。

    1. pain:如果plain为真,那么sequelize只返回第一个 记录结果集。如果为false,则返回所有记录。
    2. type:正在执行的查询的类型(也可以is hi更新哦,具体哪些去看官网api)。查询类型影响返回结果之前的格式化方式。
    3. raw:查询对类型是否有模型定义,如果您的查询没有模型定义,请将此设置为true。
    4. logging: console.log记录查询的函数 是否会为发送的每个SQL查询调用 到服务器。
  • 对于查找条件where后面的字段

    1. 如果传递数组,?将按它们在数组中出现的顺序进行替换。
    2. 如果传递了一个对象,: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变量是从前端请求获取的参数值,是一个变量哦

附件:

官网中原生语句查询地址: docs.sequelizejs.com/manual/raw-…

觉得本文对你有帮助?请分享给更多人

欢迎大家关注我的公众号——程序员成长指北。请自行微信搜索——“程序员成长指北”

猜你喜欢

转载自blog.csdn.net/weixin_33883178/article/details/91367157