Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

sequelize如何使用原生语句 #22

Open
koala-coding opened this issue Jul 14, 2019 · 0 comments
Open

sequelize如何使用原生语句 #22

koala-coding opened this issue Jul 14, 2019 · 0 comments

Comments

@koala-coding
Copy link
Owner

前言:

最近写的一个接口需要用到子查询,并且子查询的结果并不是可以在另外一个查询语句中直接当作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变量是从前端请求获取的参数值,是一个变量哦

附件:

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant