Обработка кавычек в COPY to CSV из командной оболочки

Я пытаюсь запустить этот запрос COPY из командной оболочки:

COPY products_273 TO '/tmp/products_199.csv' DELIMITER ',' CSV HEADER;

Я знаю, что вы можете запускать запросы из командной строки, используя psql:

psql -U username -d mydatabase -c 'SELECT * FROM mytable'

Но как я могу объединить 2? Кажется, что ниже не работает, но я не уверен, как / если мне нужно сбежать.

psql -U username -d mydatabase -c 'COPY products_273 TO '/tmp/products_199.csv' DELIMITER ',' CSV HEADER;'

3 ответа

Решение

Не смешивай ' а также ", цитируйте запрос с ",

psql -U username -d mydatabase -c "COPY products_273 TO '/tmp/products_199.csv' DELIMITER ',' CSV HEADER;"

Простейшим решением является (ИМХО) использование здесь-документа. Это также решит (почти) все ваши проблемы с цитированием:

#!bin/sh
psql -U username -d mydatabase <<OMG
  COPY products_273 TO '/tmp/products_199.csv' DELIMITER ',' CSV HEADER;
OMG

Предполагая UNIX(-oid) оболочку.

Если вы не можете использовать здесь документ, такой как @wildplasser, при условии, что я предлагаю долларовые кавычки для строковых литералов в вашей команде SQL. Замена окружающих одинарных кавычек двойными кавычками включит расширение переменной в оболочке, что может иметь побочные эффекты, если в них содержатся специальные символы: $, ` (обратная цитата) и \,

psql -U username -d mydatabase -c 'COPY products_273 TO $$/tmp/products_199.csv$$ DELIMITER $$,$$ CSV HEADER;'

С полными кавычками в оболочке (одинарные кавычки) строка передается как есть, никакого специального значения для любого символа.

Если специальные символы в строке SQL могут быть исключены или обработаны должным образом, простое решение @ferhat подойдет.

Или вы можете заменить каждую цитату (') внутри строки в кавычках с '\'' - который эффективно заканчивает строку в кавычках, добавляет литерал ' и начинает новую полную цитату.

psql -U username -d mydatabase -c 'COPY products_273 TO '\''/tmp/products_199.csv'\'' DELIMITER '\'','\'' CSV HEADER;'

Связанные с:

Или поместите команду SQL в отдельный файл (без кавычек) и используйте psql -f:

psql -U username -d mydatabase -f /path/to/myfile.sql

Я полагаю, вы знаете о разнице между \copy (метакоманда psql) и COPY (команда SQL). \copy читает и пишет файлы локально для клиента, в то время как COPY делает то же самое для файлов на сервере. Если клиент и сервер работают в одной и той же установке, вы можете использовать любой из них. Однако существуют определенные различия.

Другие вопросы по тегам