2016-09-16 18 views
1

私はpostgresqlでカーソルのページ設定を実装しようとしており、後にトランザクションでカーソルを作成してそこからデータを取得しようとしました。私は別のセッションでカーソルからフェッチしようとした場合SequelizeとWITH HOLDカーソル

sequelize.transaction(function (t) { 

    const query = "DECLARE my_cur CURSOR WITH HOLD FOR SELECT foo, bar FROM x " + 
     "WHERE time=\'2016-09-16\'::date;" 

    return sequelize.query(query, {transaction: t}).spread(function (results,metadata) { 
     console.log("Cursor created!") 
    }); 

}).then(function (result) { 
    console.log(result) 
    console.log("Transaction commited") 
    sequelize.query("FETCH NEXT FROM my_cur").spread(function (results,metadata) { 
     console.log("Fetching from previously created cursor:") 
     console.log(results) 
     console.log(metadata) 
    }).catch(function(err){ 
     console.log("Failed to fetch from cursor") 
     console.log(err) 
    }); 
}).catch(function (err) { 
    throw err 
    console.log("Failed to create a cursor") 
}); 

私が取得:

FETCH NEXT FROM my_cur; 
ERROR: <<my_cur>> doesn't exist. 

カーソルセッションが閉じた後に破壊されているWITH HOLDと宣言され、セッション間で共有されていない場合でも、私の質問をは、postgreSQLでセッションを処理する方法を後継していますが、別のAPI呼び出しでこのカーソルからFETCHできるようになりますか?

socket.on("fetch_next_page", function()){ 
    var cursor = socket.session.cursor 
    var pageSize = 10 
    sequelize.query("FETCH +"pageSize"+ FROM my_cur").spread(function (results,metadata) { 
      console.log("Fetching from previously created cursor:") 
      console.log(results) 
      socket.emit("page",results) 
      console.log(metadata) 
     }).catch(function(err){ 
      console.log("Failed to fetch from cursor") 
      console.log(err) 
     }); 
} 
+1

あなたが必要とするすべては、上記のクエリのセットのための共有セッションですので、あなたの代わりに、そのために[PG-約束](https://github.com/vitaly-t/pg-promise)を使用することができます。単一接続クエリを簡単に実行します。[Tasks](https://github.com/vitaly-t/pg-promise/wiki/Learn-by-Example#tasks)および[Transactions](https:// github。 com/vitaly-t/pg-promise/wiki/Example-Learn#トランザクションを参照してください)。 –

+1

悲しいことに、賞金を払ってこのことを知り、https://github.com/brianc/node-postgresを使って(成功した)実装を行いました。期限切れになる前に賞金を請求​​できるようにコメントとして投稿してください。 –

答えて

0

pg-promise内に実装と同じセッション内でのクエリのシーケンスを実行する最も簡単な方法は、タスクまたはトランザクションを経由しています。

TasksおよびTransactionsを参照してください。

クエリが依存関係にある場合は、それらの間の依存関係があるかどうかを確認するか、一致しない場合はバッチとして実行します。

そして、特定の条件までFETCHを呼び出すのと同様に、セッション内でN回反復する必要がある場合は、sequenceメソッドを使用することもできます。

+1

これはバイパスが完全に続行してクエリを実行することを意味することに注意してください。このようにしてください。 –

+0

@JesusGomez回答を更新しました。もし特定の条件まで 'FETCH'を呼び出すつもりなら、タスク/トランザクション内でメソッド' sequence'を使うのが最も有益です;) –