簡體   English   中英

從knex.js中的現有查詢中選擇

[英]Select from an existing query in 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());

但是結果是:

select * from select 1

顯然有語法錯誤。 我的預期結果是:

select * from (select 1)

為什么不加括號,如何更改?

您的方式,您的做法似乎是正確的,我會說這是knex錯誤,為什么它不起作用(我是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)' }

我發現一個難看(但knex.raw )的解決方案是使用knex.rawsubQuery.toString

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

我不認為這是最好的答案,而且我確定我錯過了一些東西,所以我還不接受這個答案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM