Команда PostgreSQL COPY — как написать запрос более чем в одну строку

Я использую базу данных PostgreSql. Я хочу выбрать некоторые данные из базы данных и скопировать их в файл csv. И это работает:

\COPY (SELECT * from table) TO '/csv_dir/csv_file.csv';

Моя проблема в том, что это работает, только если вся команда находится только в одной строке. Как написать команду COPY более чем в одну строку? Этот sql - это то, что я хочу добавить в несколько строк.


person MarsaPalas    schedule 10.04.2014    source источник
comment
кажется, вы выполняете этот запрос из консоли psql. используйте для этого клиент PgAgent   -  person Ilesh Patel    schedule 10.04.2014
comment
Мне больше нравится этот ответ запрос% 2342405094"> stackoverflow.com/questions/42404579/   -  person giorgio    schedule 09.09.2019


Ответы (1)


Как внутренняя команда psql и, как и другие команды, начинающиеся с обратной косой черты, \copy должна помещаться в одну строку.

Я предполагаю, что ваша цель - вставить длинный запрос с разрывами строк, не редактируя его.

Вы можете использовать COPY вместо \COPY, перенаправить его вывод в STDOUT и перенаправить этот stdout в файл. Пример:

$ psql -At -d test <<EOQ >outfile
COPY
 (select 1,2
  union
  select 3,4)
TO STDOUT;
EOQ

Результат:

$ cat outfile
1   2
3   4

Если вы уже находитесь в сеансе psql и эта COPY должна существовать среди других команд, ее также можно выполнить с помощью этой последовательности:

test=> \t
Showing only tuples.
test=> \o outfile
test=> copy
test->  (select 1,2
test(> union
test(> select 3,4)
test-> to stdout;
test=> \o
test=> \t
Tuples only is off.

\o outfile начинает захват вывода в файл, а \o без аргумента завершает его.

person Daniel Vérité    schedule 11.04.2014