目标
夜间导出数百万行耗时数小时,因为脚本逐行取数。本配方改用 COPY 把查询结果直接以 CSV 流式写入文件,仅一次往返即可完成导出,并用表头与行数校验结果,同时处理 NULL 标记与编码,避免下游解析出错。
步骤要点
- 用 COPY 将查询结果以 CSV 格式流式输出到文件。
- 校验表头与行数是否与预期一致。
- 显式设置 NULL 标记以匹配下游预期。
- 强制客户端编码为 UTF-8 并验证。
psql -c "COPY (SELECT * FROM orders WHERE created_at >= now() - interval '1 day') \
TO STDOUT WITH (FORMAT csv, HEADER true)" > orders_today.csv
排错提示
- COPY 不做任意逐行转换,转换需写在查询里。
- CSV 无法表达嵌套结构。
- 大导出仍会占用服务端 I/O。
适用边界
- 不适用于嵌套数据结构。
- 仍需考虑服务端 I/O 压力。