Shell脚本以CSV格式编写PostgreSQL SQL查询结果

时间:2019-05-29 10:20:45

标签: postgresql shell postgresql-9.4

我需要创建一个Linux Shell脚本来运行PostgreSQL SQL查询并以CSV格式导出结果。通过做一些研究,我知道有两种方法可以做到,例如:

  1. 使用SQL查询

    COPY table_name TO ‘file_name.csv' DELIMITER ',' CSV HEADER;
    
  2. 使用psql

    \copy table_name to 'filename.csv’ csv header
    

我在SQL Server上都尝试过这两种方法,但我发现第一种方法需要管理权限,这是我所不希望的。

我已经尝试了第二种方法,并且也能够将PostgreSQL查询输出写入CSV文件,但是现在我需要从Shell脚本执行此操作,而我面临以下问题。我在脚本中编写如下:

psql -U username -d database -c $'
\copy(WITH var(collectionMonth) as (values(\'$collectionMonth\'))
SELECT CONCAT(var.collectionMonth, LPAD(mfv2.integer_value::text,2,\'0\')) as "collection_date" FROM var,
meta_field_value mfv2 WHERE mfv2.meta_field_name_id=8 TO \'/home/my.csv\' csv HEADER;'

它显示“ \ copy附近的语法错误”。如何解决这个问题?我知道错误是由于\命令前面的copy造成的。

1 个答案:

答案 0 :(得分:2)

您的报价已关闭。

最好使用“此处的文档”:

psql -U username -d database <<EOF
\copy (WITH var(collectionMonth) as (values('$collectionMonth')) SELECT CONCAT(var.collectionMonth, LPAD(mfv2.integer_value::text,2,'0')) as "collection_date" FROM var, meta_field_value mfv2 WHERE mfv2.meta_field_name_id=8) TO '/home/my.csv' (FORMAT 'csv', HEADER)
EOF