Select 来自 knex.js 中的现有查询
Select from an existing query in knex.js
我正在使用 knex.js
构建一个查询,给定一个现有的子查询。在 GitHub 中的 this answer, and this 线程之后,我尝试了以下操作:
const knex = require("knex")({client: 'pg'});
const subQuery = knex.queryBuilder().select(1);
const query = knex.queryBuilder().select('*').from(subQuery);
console.log(query.toString());
但结果是:
select * from select 1
这显然有语法错误。我的预期结果是:
select * from (select 1)
为什么不加括号,如何修改?
我发现一个丑陋(但有效)的解决方案是使用 knex.raw
和 subQuery.toString
:
const query = knex.queryBuilder()
.select('*')
.from(knex.raw(`(${subQuery})`);
我认为这不是最佳答案,我确信我遗漏了一些东西,所以我还不接受这个答案。
你的方式,你的做法似乎是正确的,我会说它是 knex
中的错误,为什么它不起作用(我是 knex
中的合作者)。
无论如何,有几种方法可以做到...
const knex = require("knex")({client: 'pg'});
const subQuery = knex.select(1).as('t1');
const query = knex.select('*').from(subQuery);
console.log(query.toSQL());
{ method: 'select',
options: {},
timeout: false,
cancelOnTimeout: false,
bindings: [],
__knexQueryUid: '69d240ad-f5f8-4bc4-8c1d-fb9432af1da2',
sql: 'select * from (select 1) as "t1"' }
或者您可以将旧样式与 function()
子查询一起使用,它不需要 .as()
,但支持它...
const query = knex.select('*').from(sq => sq.select(1));
console.log(query.toSQL());
{ method: 'select',
options: {},
timeout: false,
cancelOnTimeout: false,
bindings: [],
__knexQueryUid: '31beb080-c89a-43b2-b112-546077330e82',
sql: 'select * from (select 1)' }
我正在使用 knex.js
构建一个查询,给定一个现有的子查询。在 GitHub 中的 this answer, and this 线程之后,我尝试了以下操作:
const knex = require("knex")({client: 'pg'});
const subQuery = knex.queryBuilder().select(1);
const query = knex.queryBuilder().select('*').from(subQuery);
console.log(query.toString());
但结果是:
select * from select 1
这显然有语法错误。我的预期结果是:
select * from (select 1)
为什么不加括号,如何修改?
我发现一个丑陋(但有效)的解决方案是使用 knex.raw
和 subQuery.toString
:
const query = knex.queryBuilder()
.select('*')
.from(knex.raw(`(${subQuery})`);
我认为这不是最佳答案,我确信我遗漏了一些东西,所以我还不接受这个答案。
你的方式,你的做法似乎是正确的,我会说它是 knex
中的错误,为什么它不起作用(我是 knex
中的合作者)。
无论如何,有几种方法可以做到...
const knex = require("knex")({client: 'pg'});
const subQuery = knex.select(1).as('t1');
const query = knex.select('*').from(subQuery);
console.log(query.toSQL());
{ method: 'select',
options: {},
timeout: false,
cancelOnTimeout: false,
bindings: [],
__knexQueryUid: '69d240ad-f5f8-4bc4-8c1d-fb9432af1da2',
sql: 'select * from (select 1) as "t1"' }
或者您可以将旧样式与 function()
子查询一起使用,它不需要 .as()
,但支持它...
const query = knex.select('*').from(sq => sq.select(1));
console.log(query.toSQL());
{ method: 'select',
options: {},
timeout: false,
cancelOnTimeout: false,
bindings: [],
__knexQueryUid: '31beb080-c89a-43b2-b112-546077330e82',
sql: 'select * from (select 1)' }