具有公共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) { // ... })
看到这里的模式细节。