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')
非常有效。谢谢。大大简化了我的代码。非常感谢你。你是救命恩人!