Подстановка переменных в psql при использовании \ copy

8

Я использую команду psql \ copy, и я хотел бы передать ей переменную из оболочки (для имени таблицы), как я делал это при написании сценариев запросов. Я прочитал в документации для PSQL, что:

Синтаксис команды аналогичен синтаксису команды SQL COPY. Обратите внимание, что из-за этого к команде \ copy применяются специальные правила синтаксического анализа. В частности, правила подстановки переменных и обратные слэши не применяются.

Это кажется вполне определенным, однако мне интересно, если кто-нибудь знает об обходном пути?

beacon_bonanza
источник

Ответы:

4

Вы можете обойти это ограничение, отправив всю команду в psql:

echo "\copy tbl FROM '/path/to/myfile.pgsql'" | psql mydb
Эрвин Брандштеттер
источник
2

Замечание: я сам наткнулся на эту проблему в MS Windows, и у меня уже было что-то, что можно вставить в psql, используя его стандартный ввод Я должен был объединить входы. И вот где это становится действительно сложно. Помимо ответа Эрвина, я подумал поделиться несколько ценным, на мой взгляд, примером, поэтому я публикую его здесь как ответ на тот случай, если кому-то еще понадобится «использовать переменную» \copyпри передаче данных в stdin на платформе Windows.

Если вы хотите скопировать некоторые данные из stdin и одновременно использовать «переменную» \copy, все может оказаться непросто, если вы не можете использовать скобки. Ниже приведен пример того, как это можно сделать. Обратите внимание на тройной (sic!) Символ вставки в скобках для имен столбцов в скобках

@echo off
set TBL=wd
(
 echo truncate %TBL%;
 echo \copy %TBL% (depth,path,name,created,accessed,modified,size^^^) from stdin csv
 C:\msys64\usr\bin\find ^
  "e:/somepath" ^
  -type f -printf "%%d,\"%%h\",\"%%f\",\"%%t\",\"%%a\",\"%%c\",%%s\n"
) | "C:\Program Files\PostgreSQL\9.4\bin\psql.exe" -h some.server -U user dbname
MLT
источник