批处理文件,用于从文件中读取sql脚本并将结果导出为csv



我想做一个批处理文件,将从。sql脚本从目录和导出结果在。csv格式查询。我需要连接到Postgres服务器。

所以我试着用答案https://stackoverflow.com/a/39049102/9631920来做这个。我的文件:

#!/bin/bash
# sql_to_csv.sh
echo test1
CONN="psql -U my_user -d my_db -h host -port"
QUERY="$(sed 's/;//g;/^--/ d;s/--.*//g;' 'folder/folder/folder/file.sql' | tr 'n' ' ')"
echo test2
echo "$QUERY"
echo test3
echo "\copy ($QUERY) to 'folder/folder/folder/file.csv' with csv header" | $CONN > /dev/null
echo query in progress

它显示了我的脚本从查询和test3,然后停止。我做错了什么?

编辑。我的文件:

#!/bin/bash
PSQL = "psql -h 250.250.250.250 -p 5432 -U user -d test"
${PSQL} << OMG2
CREATE TEMP VIEW xyz AS
`cat C:UserstestDocumentsmy_query.sql`
;
copy (select * from xyz) TO 'C:UserstestDocumentsres.csv';
OMG2

但是它没有问密码,也没有得到任何结果文件

  • 一个shell HERE-document将解决你大部分的引用问题
  • 临时视图将解决单行单查询问题

示例(使用多行双表JOIN):


#!/bin/bash
PSQL="psql -U www twitters"
${PSQL} << OMG
-- Some comment here
CREATE TEMP VIEW xyz AS
SELECT twp.name, twt.*
FROM tweeps twp
JOIN tweets twt
ON twt.user_id = twp.id
AND twt.in_reply_to_id > 3
WHERE 1=1
AND (False OR  twp.screen_name ilike '%omg%' )
;
copy (select * from xyz) TO 'omg.csv';
OMG                     

如果需要现有.sql文件的内容,可以在here文档中添加它,使用反引号展开:


#!/bin/bash
PSQL="psql -X -n -U www twitters"
${PSQL} << OMG2
-- Some comment here
CREATE TEMP VIEW xyz AS
-- ... more comment
-- cat the original file here
`cat /home/dir1/dir2/dir3/myscript.sql`
;
copy (select * from xyz) TO 'omg.csv';
OMG2

最新更新