基于节点的 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 查询构建器的明显竞争者?据我所知,这些是最明显的四个:
- node-sql
- nodesql(不支持 postgres?)
- knex.js
- 续集
我能够在 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 子句。
我正在构建一个 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 查询构建器的明显竞争者?据我所知,这些是最明显的四个:
- node-sql
- nodesql(不支持 postgres?)
- knex.js
- 续集
我能够在 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 子句。