2017-02-08 10 views
1

私はknex.jsを使用して既存のサブクエリを使用してクエリを作成しています。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()); 

しかし、結果はでした::this答え、およびGitHubの中thisスレッドに続いて、私は次のことを試してみました

select * from select 1 

明らかに構文エラーがありますどの。私の期待される結果は:

select * from (select 1) 

なぜかっこは追加されません。どうすれば変更できますか?

答えて

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"' } 

それとも.as()を必要としないfunction()サブクエリ、と古いスタイルを使用しますが、それをサポートすることができます...

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)' } 
+0

私は第1の解決策を使用しました。そして 'as( 't1')'は魅力的に働きました。ありがとう。 – GilZ

+0

私のコードを大きく単純化しました。どうもありがとうございました。あなたは命の恩人です! –

0

私はknex.rawsubQuery.toStringを使用していた見つけ醜い(しかし作業)ソリューション:

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

私はこれが最良の答えであるとは考えていない、と私は何かが欠けてると確信しているので、私まだこの答えを受け入れてはいけません。

+0

生のクエリを渡すために '.toString()'を使用しないでください...これはknexが補間するようにします。パラメタのバインディング自体が存在し、SQLインジェクションを防ぐためにデータベースドライバの実装を使用することはできません。 '.toSQL()'はあなたにバインディングとSQLを別々に提供します。 –

関連する問題