从knex.js中的现有查询中select

我build立一个查询使用knex.js ,给定一个现有的子查询。 在这个答案和这个线程在GitHub中,我尝试了以下内容:

 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 )。

反正有几种方法可以做到这一点…

 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)' } 

我发现一个丑陋的(但工作)的解决scheme是使用knex.rawsubQuery.toString

 const query = knex.queryBuilder() .select('*') .from(knex.raw(`(${subQuery})`); 

我不相信这是最好的答案,我相信我错过了一些东西,所以我不接受这个答案。