我想做一个批处理文件,将从。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