Substitution de variables dans psql lors de l'utilisation de \ copy

8

J'utilise la commande \ copy de psql et je voudrais lui passer une variable à partir du shell (pour le nom de la table) comme je l'ai fait lors des scripts de requêtes. J'ai lu dans la documentation de psql que:

La syntaxe de la commande est similaire à celle de la commande SQL COPY. Notez que, pour cette raison, des règles d'analyse spéciales s'appliquent à la commande \ copy. En particulier, les règles de substitution de variable et les échappements antislash ne s'appliquent pas.

Cela semble assez définitif, mais je me demande si quelqu'un connaît une solution de contournement?

beacon_bonanza
la source

Réponses:

4

Vous pouvez contourner cette limitation en redirigeant la commande entière vers psql:

echo "\copy tbl FROM '/path/to/myfile.pgsql'" | psql mydb
Erwin Brandstetter
la source
2

Remarque: je suis tombé sur ce problème moi-même sur MS Windows et j'avais déjà quelque chose à alimenter en psql en utilisant son stdin. J'ai dû combiner des entrées. Et c'est là que ça devient vraiment délicat. J'ai pensé partager un exemple quelque peu précieux à mon avis, en plus de la réponse d'Erwin, donc je le poste ici comme réponse au cas où quelqu'un d'autre aurait également besoin "d'utiliser des variables" avec \copytout en introduisant des données dans stdin sur la plate-forme Windows.

Si vous voulez copier certaines données de stdin et utiliser "variable" pour \copyen même temps, les choses peuvent devenir délicates avec des parenthèses qui s'échappent. Voici un exemple de la façon dont cela peut être fait. Remarquez l' échappement triple (sic!) Caret pour les parenthèses des noms de colonnes

@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
la source