Sostituzione variabile in psql quando si utilizza \ copy


8

Sto usando il comando psql \ copy e vorrei passargli una variabile dalla shell (per il nome della tabella) come ho fatto durante le query di script. Ho letto nella documentazione per psql che:

La sintassi del comando è simile a quella del comando COPIA SQL. Si noti che, per questo motivo, al comando \ copy si applicano regole di analisi speciali. In particolare, non si applicano le regole di sostituzione delle variabili e gli escape di barra rovesciata.

Sembra abbastanza definitivo, tuttavia mi chiedo se qualcuno sia a conoscenza di una soluzione alternativa?

Risposte:


4

Puoi aggirare questa limitazione inviando l'intero comando a psql:

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

2

Nota: mi sono imbattuto in questo problema da solo su MS Windows e avevo già qualcosa da inserire in psql usando il suo stdin. Ho dovuto combinare input. Ed è qui che diventa davvero complicato. Ho pensato di condividere un po 'di valore nel mio esempio di opinione, oltre alla risposta di Erwin, quindi lo inserisco qui come risposta nel caso in cui anche qualcun altro abbia bisogno di "usare la variabile" \copymentre alimenta i dati nello stdin sulla piattaforma Windows.

Se vuoi copiare alcuni dati da stdin e usare "variabile" \copyallo stesso tempo, le cose potrebbero diventare complicate con la fuga delle parentesi. Di seguito è riportato un esempio di come si può fare. Nota la tripla (sic!) Punto di inserimento del cursore per le parentesi che scoprono i nomi delle colonne

@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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.