Скрипт оболочки для записи результатов SQL-запросов PostgreSQL в формат CSV - PullRequest
0 голосов
/ 29 мая 2019

Мне нужно создать сценарий оболочки Linux для запуска SQL-запроса PostgreSQL и экспорта результатов в формате CSV.Проведя некоторое исследование, я узнал, что есть два способа сделать это, как показано ниже:

  1. с помощью SQL-запроса

    COPY table_name TO ‘file_name.csv' DELIMITER ',' CSV HEADER;
    
  2. используя psql

    \copy table_name to 'filename.csv’ csv header
    

Я пробовал оба с сервера SQL, из которого я обнаружил, что первый метод требует административного разрешения, а я не хочу.

Я попробовал второй метод и могу также записать вывод запроса PostgreSQL в файл CSV, но теперь мне нужно сделать это из сценария оболочки, где я сталкиваюсь с проблемой ниже.Я пишу внутри скрипта следующим образом:

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 Ответ

2 голосов
/ 29 мая 2019

Ваша цитата выключена.

Лучше всего использовать & ldquo; здесь документ & rdquo;

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
...