Substituição variável no psql ao usar \ copy


8

Estou usando o comando psql \ copy e gostaria de passar uma variável para ela a partir do shell (para o nome da tabela), como fiz ao criar consultas de script. Eu li na documentação do psql que:

A sintaxe do comando é semelhante à do comando SQL COPY. Observe que, por isso, regras especiais de análise se aplicam ao comando \ copy. Em particular, as regras de substituição de variáveis ​​e escapes de barra invertida não se aplicam.

Isso parece bastante definitivo, no entanto, estou me perguntando se alguém sabe de uma solução alternativa?

Respostas:


4

Você pode contornar essa limitação canalizando todo o comando para o psql:

echo "\copy tbl FROM '/path/to/myfile.pgsql'" | psql mydb

2

Observação: Eu me deparei com esse problema no MS Windows e já tinha algo para alimentar o psql usando seu stdin. Eu tive que combinar entradas. E é aí que fica realmente complicado. Eu pensei em compartilhar um pouco de valor no meu exemplo de opinião, além da resposta de Erwin, por isso estou postando aqui como resposta, caso outra pessoa também precise "usar variável" \copyenquanto alimenta dados no stdin na plataforma Windows.

Se você deseja copiar alguns dados do stdin e usar "variável" \copyao mesmo tempo, as coisas podem ficar complicadas com os parênteses escapando. Abaixo está um exemplo de como isso pode ser feito. Observe escape de intercalação triplo (sic!) Para nomes de colunas com escopo entre parênteses

@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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.