如何设置 Sequelize.js 来传输数据而不是承诺/回调?

问题描述 投票:0回答:3

我正在使用

MySQL
并且有非常大的响应(15,000 多行)。这需要……嗯……时间。但我可以立即开始处理第一个结果。我可以用
sequelize
以某种方式设置流吗?如果是的话,怎么办?

mysql node.js sequelize.js
3个回答
13
投票

有一个相关的 GitHub 。看来近期不会发生。

现在我正在监视我的控制台,保存 Sequelize 生成的查询,然后重构我的代码以使用 node-mysql 运行查询。

connection.query(mySavedQuery).stream().pipe(...)

1
投票

您还可以使用

node-sequelize-stream
库。


0
投票

我创建了一个异步迭代器,它使用分页来获取块中的行。 如果您在

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)
}
© www.soinside.com 2019 - 2024. All rights reserved.