← 中文资源

简体中文版本

流式导出大型 CSV

按需写入响应并定期刷新,对数据库游标施加背压,使大数据量导出时内存占用保持平稳。

阅读英文原文

概述

大导出应是管道而非缓冲。从游标逐行读取并边读边写,在客户端断开时终止查询,避免单次被放弃的下载耗尽数据库资源。

关键步骤

  1. 写入任何数据前设置 CSV 内容类型与附件文件名。
  2. 从游标读取行并逐条写出行,按批刷新。
  3. 按 RFC 4180 转义含逗号、引号或换行的字段。
  4. 客户端断开时销毁游标以停止查询。

验证

  • 内存占用随行数增长保持平稳。
  • 下载文件能被表格软件正常打开。
  • 含逗号与引号的字段被正确转义。
  • 取消下载会停止查询。

注意事项

  • 流式导出无法报告总行数,失败后也难以续传,除非额外记录。
  • 超宽行与慢客户端会使导出时长超过查询本身。

适用范围

本条目围绕「流式导出大型 CSV」给出可复制的步骤、验证方式与常见问题,适合需要按此流程落地的工程团队。执行时请结合自身上下文调整命令与阈值,并在变更前后留存证据,便于后续复核与回滚。

建议在正式环境落地前先在预发或隔离环境演练一遍,把关键观测指标与负责人一并记录,确保出现异常时能快速定位并恢复。

res.setHeader('Content-Type', 'text/csv; charset=utf-8');
res.setHeader('Content-Disposition', 'attachment; filename="export.csv"');
for await (const row of cursor) res.write(toCsv(row));
res.end();