2016-09-16 3 views
1

Ich versuche, Cursor Seitennummerierung mit Postgresql und Sequelize zu implementieren, habe ich mit Erfolg versucht, einen Cursor mit HOLD auf eine Transaktion und Abrufen von Daten aus ihm.Sequelize und WITH HOLD Cursor

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") 
}); 

Wenn ich versuche, aus dem Cursor in einer anderen Sitzung zu holen erhalte ich:

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

Cursoren auch wenn WITH HOLD deklariert zerstört werden, nachdem eine Sitzung geschlossen und nicht zwischen den Sitzungen, meine Frage geteilt ist, wie Sequelize behandelt Sitzungen mit PostgreSQL, werde ich in der Lage sein, von diesem Cursor auf einem separaten API-Aufruf?

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

Da Sie nur eine gemeinsame Sitzung für die oben genannten Abfragen benötigen, können Sie stattdessen [pg-promise] (https://github.com/vitaly-t/pg-promise) verwenden. Es führt problemlos Einzelverbindungsabfragen aus, siehe [Aufgaben] (https://github.com/vitaly-t/pg-promise/wiki/Learn-by-Example#tasks) und [Transaktionen] (https: // github. com/vitaly-t/pg-promise/wiki/Lernen-durch-Beispiel # Transaktionen). –

+1

Leider habe ich davon erfahren, nachdem ich das Bounty gemacht und eine (erfolgreiche) Implementierung mit https://github.com/brianc/node-postgres gemacht habe, bitte posten Sie Ihren Kommentar als Antwort, damit Sie das Bounty beanspruchen können, bevor es abläuft. –

Antwort

0

Der einfachste Weg, eine Folge von Abfragen innerhalb der gleichen Sitzung auszuführen ist über eine Aufgabe oder Transaktion innerhalb pg-promise umgesetzt.

Siehe Tasks und Transactions.

Sie würden entweder Ihre Abfragen versprechen, wenn sie eine Abhängigkeit zwischen ihnen haben, oder sie als Stapel ausführen, wenn sie dies nicht tun.

Und wenn Sie N Zeiten innerhalb der Sitzung wiederholen müssen, wie FETCH bis bestimmte Bedingung aufrufen, können Sie auch Methode sequence verwenden.

+1

macht Sinn, beachten Sie, dass dies bedeutete Umgehung Sequelize vollständig um die Abfragen zu tun, aber auf diese Weise ok –

+0

@JesusGomez Ich habe die Antwort aktualisiert. Wenn Sie 'FETCH' bis zu bestimmten Bedingungen aufrufen wollen, ist die Verwendung der Methode' sequenz' innerhalb der Aufgabe/Transaktion am vorteilhaftesten;) –