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

Javascript 从knex.js中的现有查询中选择,javascript,node.js,knex.js,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()); 但结果是: s

给定一个子查询,我正在使用
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.raw
子查询.toString

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

我不相信这是最好的答案,我肯定我遗漏了一些东西,所以我还不接受这个答案。

你的方式,你是如何做到的,这似乎是正确的,我想说这是
knex
中的bug,为什么它不起作用(我是
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)' }

永远不要使用
.toString()
来传递原始查询。。。这将导致knex自行插入例如参数绑定,并且它将无法使用数据库驱动程序的实现来阻止SQL注入
.toSQL()
分别为您提供绑定和sql。我使用了第一种解决方案,
as('t1')
非常有效。谢谢。大大简化了我的代码。非常感谢你。你是救命恩人!