如何在psql的\copy命令行中直接传入SQL文件作为执行内容
实现psql \copy 传入SQL文件的无长度限制方案
之前的同类解决方案本质是将SQL文件内容直接展开到命令行参数中,受操作系统最大命令行长度(ARG_MAX)约束,SQL文件较大时就会报错。以下方案可完全规避该问题:
推荐方案:标准输入流传递命令
该方案不需要将SQL内容放到命令行参数中,所有指令通过流传递给psql,无论SQL文件体积多大都可正常运行:
- 基础执行命令:
{ echo "\copy ("; cat 你的SQL文件路径; echo ") TO './test.csv' WITH CSV"; } | psql 你的数据库名
- 适配带分号的SQL文件的命令:
如果你的SQL文件末尾带有多余分号,可自动移除避免语法错误,同时可根据需要添加HEADER参数导出表头:
{ echo "\copy ("; sed 's/;$//' 你的SQL文件路径; echo ") TO './test.csv' WITH CSV HEADER"; } | psql 你的数据库名
- 优势:不需要对SQL中的特殊字符做额外转义,兼容性远高于
-c参数传入方案。
轻量方案(仅适用于小型SQL文件)
如果SQL文件内容较短,不需要考虑长度限制,可直接用简化写法:
psql 你的数据库名 -c "\copy ($(< 你的SQL文件路径)) TO './test.csv' WITH CSV"
内容的提问来源于stack exchange,提问作者Lost Crotchet
相关产品推荐
相关产品推荐

