2015-01-07 10 views
5

CTEを使用してRedshiftデータベース(Postgres 8.0.2に基づいて)を照会する必要があるNode.jsアプリケーションを構築しています。残念ながら、これまでに見たSQLクエリービルダー(node-sql,、後継版)は共通テーブル式(CTE)をサポートしていないようです。共通テーブル式(WITH句)をサポートするノードベースのSQLビルダー

Rubyでは、テーブルのエイリアス名とデータセット参照を定義するために2つの引数をとるwithメソッドを持つJeremy EvansのSequel gemを使用して、Rubyで一般的なテーブル式を作成するのに成功しました。私はNodeで似たようなことをしたいと思います。

私はNode.js SQLクエリビルダーの明らかな候補を見逃しましたか?私が言うことができるものから、これらは4つの最も明白ではない:

  • nodesql
  • nodesql(なしのpostgresをサポートしていますか?)私はできた
  • sequelize

答えて

2

  • knex.jsは、 knex.jsで共通テーブル式(CTE)を使用するのはかなり簡単でした。

    function knexExample (io, knex) { 
        io.on('connection', function (socket) { 
        var this_cte = knex('this_table').select('this_column'); 
    
        var that_cte = knex('that_table').select('that_column'); 
    
        knex.raw('with t1 as (' + this_cte + 
        '), t2 as (' + that_cte + ')' + 
        knex.select(['this', 'that']) 
         .from(['t1', 't2']) 
        ) 
        .then(function (rows) { 
         socket.emit('this_that:update', rows); 
        }); 
        }) 
    } 
    
    module.exports = knexExample; 
    
  • +0

    私は以上の構成要素のクエリの1(CTEは、最終 'knex.select(場合などが壊れるだと思います) ')はバインドされたパラメータを使用しました。文字列連結を使用する代わりに、実際に 'knex.raw'のバインディングを使用することをお勧めします:' knex.raw( 'とt1を(?)、t2を(?)?'、[this_cte、that_cte、knex.select (['t1'、 't2'])]) 'これは2015年4月30日にリリースされたknexバージョン0.8.0を必要とします。また、knexの「Raw Queries」機能を起動します。つまり、「基本的なSQLライブラリが通常のクエリで返すものは何でも応答します」という意味です。 – codermonkeyfuel

    +2

    また、knexでのCTEのファーストクラスサポートの実装については、[knex issue#716](https://github.com/tgriesser/knex/issues/716)を参照してください。 – codermonkeyfuel

    +1

    クエリ文字列を連結し、 'knex.raw'を使用すると、クエリビルダを最初に使用する目的が無効になります。 –

    0
    this issueから

    this issue私はあなたがSequelizeでCTEを使用できることを理解:あなたはknex.js、

    knex-example.jsとともにsocket.io使用していると仮定すると、

    SequelizeがSelectクエリであることを確認するには、生のクエリを使用する必要があります。最初のリンクを参照してください。

    サンプル・コードは次のようになります。

    sequelize.query(
        query, //raw SQL 
        tableName, 
        {raw: true, type: Sequelize.QueryTypes.SELECT} 
    ).success(function (rows) { 
        // ... 
    }) 
    

    モードの詳細についてhereを参照してください。

    1

    knex.jsは今、WITH句をサポートします。

    knex.with('with_alias', (qb) => { 
        qb.select('*').from('books').where('author', 'Test') 
    }).select('*').from('with_alias') 
    

    出力:

    with "with_alias" as (select * from "books" where "author" = 'Test') select * from "with_alias" 
    
    関連する問題