Использование курсора с pg-обещанием - PullRequest
0 голосов
/ 05 июня 2018

Я пытаюсь найти пример использования курсора с pg-обещанием.node-postgres поддерживает расширение pg-cursor.Есть ли способ использовать это расширение с pg-promise?Я пытаюсь реализовать асинхронный генератор (для поддержки for-await-of).pg-query-stream не подходит для этого случая использования (мне нужно «тянуть», а не «толкать»).

В качестве примера я использую SQLite для своих модульных тестов и мой (сокращенно) генератор выглядит примерно так ...

async function* () {

    const stmt = await db.prepare(...);

    try {

        while (true) {

            const record = await stmt.get();

            if (isUndefined(record)) {

                break;
            }

            yield value;
        }
    }
    finally {

        stmt.finalize();
    }
}

Используя pg-курсор, присвоение stmt станет чем-то вроде client.query(new Cursor(...)), stmt.get станет stmt.read(1) и stmt.finalizeстанет stmt.close.

Спасибо

1 Ответ

0 голосов
/ 05 июня 2018

Следуя исходным примерам , мы можем изменить их для использования с pg-обещанием :

const pgp = require('pg-promise')(/* initialization options */);
const db = pgp(/* connection details */);

const Cursor = require('pg-cursor');

const c = await db.connect(); // manually managed connection

const text = 'SELECT * FROM my_large_table WHERE something > $1';
const values = [10];

const cursor = c.client.query(new Cursor(text, values));

cursor.read(100, (err, rows) => {
  cursor.close(() => {
    c.done(); // releasing connection
  });
  // or you can just do: cursor.close(c.done);
});

, начиная с pg-обещания явно не поддерживает pg-cursor , необходимо вручную получить объект подключения и использовать его напрямую, как показано в примере выше.

pg-query-stream hasnКажется, не подходит для этого варианта использования (мне нужно pull, а не push).

На самом деле, в контексте этих библиотек как потоки, так и курсоры предназначены только для извлеченияданные.Так что было бы хорошо, чтобы вы также использовали потоковую передачу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...