从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.raw
和subQuery.toString
:
const query = knex.queryBuilder() .select('*') .from(knex.raw(`(${subQuery})`);
我不相信这是最好的答案,我相信我错过了一些东西,所以我不接受这个答案。