具有公共expression式(WITH子句)支持的基于节点的SQL生成器

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

我在Ruby中使用Jeremy Evans的Sequel gem获得了巨大的成功,它有一个with两个参数的方法来定义表的别名和数据集引用。 我想在Node中有类似的东西。

我错过了Node.js SQL查询构build器的任何明显的竞争者吗? 从我所能告诉的是,这四个最明显的是:

  • 节点-SQL
  • nodesql(没有postgres支持?)
  • knex.js
  • sequelize

我能用knex.js使用公共表格expression式(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; 

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" 

从这个问题和这个问题我明白,你可以使用CTE与Sequelize。

你需要使用原始查询,也许确切的types,以确保Sequelize明白这是一个Select查询。 看第一个链接。

示例代码将是:

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

看到这里的模式细节。