我正在尝试使用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)
});
}
答案 0 :(得分:0)
在同一会话中执行一系列查询的最简单方法是通过pg-promise内实现的任务或事务。
请参阅Tasks和Transactions。
如果他们之间存在依赖关系,您可以保证链接您的查询,也可以批量执行,如果他们没有。
如果你需要在会话中迭代N次,比如调用FETCH
直到某个条件,你也可以使用方法sequence。