基于节点的 SQL 构建器,支持 Common Table 表达式(WITH 子句)

Node-based SQL builder with Common Table Expression (WITH clause) support

我正在构建一个 Node.js 应用程序,它需要使用 CTE 查询 Redshift 数据库(基于 postgres 8.0.2)。不幸的是,到目前为止我看过的 SQL 查询构建器(node-sql, knex.js 和 sequelize)似乎不支持常见的 table 表达式(CTE)。

我使用 Jeremy Evans 的 Sequel gem 在 Ruby 中成功地形成了常见的 table 表达式,它有一个 with 方法,该方法采用两个参数来定义tables 的别名和数据集引用。我想要 Node 中的类似内容。

我是否错过了 Node.js SQL 查询构建器的明显竞争者?据我所知,这些是最明显的四个:

我能够在 knex.js 中使用常见的 table 表达式 (CTE),这非常简单。

假设您同时使用 socket.io 和 knex.js、

knex-example.js:

function knexExample (io, knex) {
  io.on('connection', function (socket) {
    var this_cte = knex('this_table').select('this_column');

    var that_cte = knex('that_table').select('that_column');

    knex.raw('with t1 as (' + this_cte + 
    '), t2 as (' + that_cte + ')' + 
    knex.select(['this', 'that'])
      .from(['t1', 't2'])
    )
    .then(function (rows) {
      socket.emit('this_that:update', rows);
    });
  })
}

module.exports = knexExample;

来自 this issue and this issue 我了解到您可以将 CTE 与 Sequelize 一起使用。

您需要使用原始查询并且可能需要精确的类型,以确保 Sequelize 理解它是一个 Select 查询。先看link.

示例代码为:

sequelize.query(
  query, //raw SQL
  tableName,
  {raw: true, type: Sequelize.QueryTypes.SELECT}
).success(function (rows) {
  // ...
})

有关模式的详细信息,请参阅 here

knex.js 现在支持 WITH 子句:

knex.with('with_alias', (qb) => {
  qb.select('*').from('books').where('author', 'Test')
}).select('*').from('with_alias')

输出:

with "with_alias" as (select * from "books" where "author" = 'Test') select * from "with_alias"

xql.js 从 1.4.12 版本开始支持 WITH 子句。一个小例子:

const xql = require("xql");
const SELECT = xql.SELECT;

return SELECT()
 .WITH("with_alias", SELECT().FROM("books").WHERE("author", "=", "Test"))
 .FROM("with_alias");

SELECT、INSERT、UPDATE、DELETE 和复合查询也支持 WITH 子句。