我正在使用
MySQL
并且有非常大的响应(15,000 多行)。这需要……嗯……时间。但我可以立即开始处理第一个结果。我可以用 sequelize
以某种方式设置流吗?如果是的话,怎么办?
有一个相关的 GitHub 。看来近期不会发生。
现在我正在监视我的控制台,保存 Sequelize 生成的查询,然后重构我的代码以使用 node-mysql 运行查询。
connection.query(mySavedQuery).stream().pipe(...)
您还可以使用
node-sequelize-stream
库。
我创建了一个异步迭代器,它使用分页来获取块中的行。 如果您在
order
上有索引,这应该具有一定的性能,但不幸的是仍然不是您使用数据库游标获得的效果。export async function* findAllPagination<M extends Model>(
model: ModelStatic<M>,
options: FindOptions<Attributes<M>>,
pageSize: number,
) {
if (!options.order) {
throw new Error(`${model.name} has no order defined. Order is required to provide stable pagination`);
}
let offset = 0;
let count = 0;
do {
const result = await model.findAll({
...options,
limit: pageSize,
offset,
});
yield result;
count = result.length;
offset += count;
} while (count === pageSize);
}
用途:
const loader = findAllPagination(MyModel, {
where: {
foo: 'bar',
},
order: [['id', 'DESC']],
}, 1000);
for await (const features of loader) {
doThings(features)
}