Sequelize和WITH HOLD游标

时间:2016-09-16 15:41:24

标签: node.js postgresql cursor sequelize.js

我正在尝试使用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 个答案:

答案 0 :(得分:0)

在同一会话中执行一系列查询的最简单方法是通过pg-promise内实现的任务或事务。

请参阅TasksTransactions

如果他们之间存在依赖关系,您可以保证链接您的查询,也可以批量执行,如果他们没有。

如果你需要在会​​话中迭代N次,比如调用FETCH直到某个条件,你也可以使用方法sequence