概述
大导出应是管道而非缓冲。从游标逐行读取并边读边写,在客户端断开时终止查询,避免单次被放弃的下载耗尽数据库资源。
关键步骤
- 写入任何数据前设置 CSV 内容类型与附件文件名。
- 从游标读取行并逐条写出行,按批刷新。
- 按 RFC 4180 转义含逗号、引号或换行的字段。
- 客户端断开时销毁游标以停止查询。
验证
- 内存占用随行数增长保持平稳。
- 下载文件能被表格软件正常打开。
- 含逗号与引号的字段被正确转义。
- 取消下载会停止查询。
注意事项
- 流式导出无法报告总行数,失败后也难以续传,除非额外记录。
- 超宽行与慢客户端会使导出时长超过查询本身。
适用范围
本条目围绕「流式导出大型 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();