2017-02-22 61 views
10

Это следующий вопрос от this answer по поводу "Save PL/pgSQL output from PostgreSQL to a CSV file".Используйте psql's copy для многострочного запроса

Мне нужно написать CSV-файл на стороне клиента, используя psql's \copy command. Один лайнер работает:

db=> \copy (select 1 AS foo) to 'bar.csv' csv header 
COPY 1 

Однако, у меня есть длинные запросы, которые охватывают несколько строк. Мне не нужно, чтобы показать запрос, так как я не могу показаться, чтобы продлить этот прошлый одну строку без ошибки синтаксического анализа:

db=> \copy (
\copy: parse error at end of line 
db=> \copy (\\ 
\copy: parse error at end of line 
db=> \copy (" 
\copy: parse error at end of line 
db=> \copy "(
\copy: parse error at end of line 
db=> \copy \\ 
\copy: parse error at end of line 

Можно ли использовать \copy с запросом, который охватывает несколько строк? Я использую psql для Windows.

+0

Вам, вероятно, придется избегать новых линий? – Falmarri

+0

@Falmarri Я поставил несколько общих попыток эвакуации в моем вопросе, но из документов «psql ... обратные сбрасывающие экраны не применяются» к '\ copy', что усложняет ситуацию. –

+0

Я отправил ей ответ: http://stackoverflow.com/a/44043716/24105, который представляет собой окольный путь для получения нескольких строк. –

ответ

11

Рабочее решение, которое я имею сейчас, это create a temporary view, которое может быть объявлено на нескольких строках, а затем выбрать из него команду \copy, которая удобно помещается на одной линии.

db=> CREATE TEMP VIEW v1 AS 
db-> SELECT i 
db-> FROM generate_series(1, 2) AS i; 
CREATE VIEW 
db=> \cd /path/to/a/really/deep/directory/structure/on/client 
db=> \copy (SELECT * FROM v1) TO 'out.csv' csv header 
COPY 2 
db=> DROP VIEW v1; 
DROP VIEW 
+0

Вам нужно явно удалить представление, если это временное представление? – nyxz

+1

@nyxz это правильно, вам не нужно отбрасывать этот вид. Это может быть необходимо, только если у вас есть несколько запросов для обработки с помощью 'v1'. –