我很难找到一个使用带有pg-promise的游标的例子。 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-cursor,对stmt
的分配将变为client.query(new Cursor(...))
,stmt.get
将变为stmt.read(1)
,stmt.finalize
将变为stmt.close
}。
由于
答案 0 :(得分:2)
关注the original examples,我们可以修改它们以便与pg-promise一起使用:
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-promise没有明确支持pg-cursor,因此必须手动获取连接对象并直接使用它,如上例所示。
pg-query-stream似乎不适合这个用例(我需要
pull
,而不是push
)。
实际上,在这些库的上下文中,流和游标都只用于提取数据。所以你也可以使用流媒体。