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

时间:2017-02-08 15:00:20

标签: javascript node.js knex.js

在给定现有子查询的情况下,我正在使用-Djavax.xml.parsers.SAXParserFactory=com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl构建查询。在GitHub中的this回答和this主题后,我尝试了以下内容:

knex.js

但结果是:

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

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

2 个答案:

答案 0 :(得分:2)

你的方式,你是怎么做的似乎是正确的,我会说它是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)' }

答案 1 :(得分:0)

我发现一个丑陋(但有效)的解决方案是使用knex.rawsubQuery.toString

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

我不相信这是最好的答案,我确定我错过了什么,所以我还不接受这个答案。