Обработка кавычек в 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
делает то же самое для файлов на сервере. Если клиент и сервер работают в одной и той же установке, вы можете использовать любой из них. Однако существуют определенные различия.