【问题标题】:How to pass order info to sequelize.js raw query?如何将订单信息传递给 sequelize.js 原始查询?
【发布时间】:2020-04-21 03:09:58
【问题描述】:

在sequelize中,我可以使用

my_table.findAll({ order: [['datetime', 'desc']] }) 

按列查询数据和排序。但是当我尝试使用参数化原始查询时:

var input_parameters = {order_column: 'datetime', order: 'desc'};

sequelize.query('select * from my_table order by :order_column :order',     { replacements: input_parameters, type: models.sequelize.QueryTypes.SELECT });

它无法返回正确的订单,因为 订单信息 asc/desc 在查询中被转义,最终准备好的查询就像 'select * from my_table order by 'datetime' 'desc''。

有没有办法将订单信息传递给原始参数化查询?

【问题讨论】:

  • 你有没有找到一个好的解决方案?

标签: node.js sequelize.js


【解决方案1】:

这可能不是续集方式,但是……如果:

let order_column = 'something';
let order = 'DESC';

sequelize.query(`select * from my_table order by ${order_column} ${order}`, { type: models.sequelize.QueryTypes.SELECT });

更新: 这是正确的答案

await sequelize.query(
  'SELECT * FROM projects ORDER BY ? ?',
  {
    replacements: ['something', 'desc'],
    type: QueryTypes.SELECT,
  }
);

这种方式 sequelize 仍然可以保护您免受 sql 注入。

【讨论】:

【解决方案2】:

我也想知道。但我认为原始查询中没有选项。

所以我通常在model 中定义class methods 来使用类似sequelize 的方法。

/**
 * usage :
 *
 * model.findSomething({
 *   where: whereCondition,
 *   limit: limit,
 *   offset: offset,
 *   order: [
 *     ['col1', 'asc'],
 *     ['col2', 'desc']
 *   ]})
 */
model.findSomething = function ({where, limit, offset, order}) {

  let sql = 'SELECT col1, col2 FROM some_table '

... (build where conditions)

  // build order conditions
  if (order && order.length > 0) {
    let orderBy = ' ORDER BY '
    for (let i = 0; i < order.length; i++) {
      if (order[i].length > 0) { // [column] or [column, asc/desc]
        orderBy += (i > 0 ? ', ' : ' ') + order[i].join(' ')
      }
    }
    sql += orderBy
  } else {
    sql += ` ORDER BY comment_group, comment_depth, comments.comment_id`
  }

... (build limit and offset)
}

在调用sequelize.query 之前,只需先构建sql statement

回答太晚了,希望对你有所帮助。

【讨论】:

    【解决方案3】:
    let order_column = 'something';
    let order = 'DESC';
    
    sequelize.query('select * from my_table order by " + order_column +' ' order,     { replacements: input_parameters, type: models.sequelize.QueryTypes.SELECT })
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-29
      • 2017-09-20
      • 2011-02-27
      • 2014-05-03
      相关资源
      最近更新 更多