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