从 knex.js 中的现有查询中选择

Gil*_*ilZ 2 javascript node.js knex.js

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());
Run Code Online (Sandbox Code Playgroud)

但结果是:

select * from select 1
Run Code Online (Sandbox Code Playgroud)

这显然有语法错误。我的预期结果是:

select * from (select 1)
Run Code Online (Sandbox Code Playgroud)

为什么不添加括号,我该如何更改它?

Mik*_*stö 6

Your way, how you did it seems correct and I would say that it is bug in knex why it doesn't work (I'm collaborator in knex).

Anyways there are couple of ways to do it...

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"' }
Run Code Online (Sandbox Code Playgroud)

Or you can use older style with function() subquery, which doesn't require .as(), but supports it...

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)' }
Run Code Online (Sandbox Code Playgroud)