\copy
можно использовать временную таблицу.
Сначала я проверил и подтвердил это с помощью версии 9.0 в командной строке.
Затем я создал файл с мета-командой SQL и psql, \copy
используя несколько временных таблиц. Это сработало и для меня.
CREATE TEMP TABLE tmp as SELECT * FROM tbl;
\copy (SELECT * FROM tmp JOIN tbl USING (id)) TO '/var/lib/postgres/test1.csv';
Вызов:
psql -p5432 mydb -f test.sql
Обратите внимание на завершающую точку с запятой, которая необязательна в конце файла (неявно завершается), но обязательна после любого другого оператора SQL, а также после последнего, если выполняется в psql в интерактивном режиме.
Обычно метакоманды psql нельзя смешивать с SQL в одной строке файла, выполняемого в psql -f
. Я цитирую руководство по PSQL :
Разбор аргументов прекращается в конце строки или при обнаружении другого обратного слэша без кавычек. Обратная косая черта без кавычек принимается за начало новой мета-команды. Специальная последовательность \\
(две обратные косые черты) отмечает конец аргументов и продолжает синтаксический анализ команд SQL, если таковые имеются. Таким образом, команды SQL и psql могут свободно смешиваться в строке. Но в любом случае аргументы метакоманды не могут продолжаться после конца строки.
Однако после этого применяются другие правила \copy
. По сути, psql автоматически переключается в режим SQL после \copy
See:
Но вы написали, что у вас есть все команды в отдельных строках. Так что это не может быть объяснением в вашем случае.
Помимо всего прочего, вы рассматривали возможность использования COPY
(команда SQL ) вместо \copy
( метакоманда psql )?
Конечно, в этом случае целевой файл должен быть локальным для сервера, а не для клиента. И разные файловые привилегии применяются. Руководство :
Файлы, названные в COPY
команде, считываются или записываются непосредственно сервером, а не клиентским приложением. Поэтому они должны находиться или быть доступными для компьютера сервера базы данных, а не для клиента. Они должны быть доступны и доступны для чтения или записи пользователю PostgreSQL (идентификатор пользователя, под которым работает сервер), а не клиенту.