web-dev-qa-db-fra.com

Substitution variable dans le PSQL lors de l'utilisation \ copie

J'utilise la commande PSQL\Copie et j'aimerais transmettre une variable à partir de la coque (pour le nom de la table) comme si j'ai fait lors de la sélection des requêtes de script. J'ai lu dans la documentation pour psql que:

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

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

8
beacon_bonanza

Vous pouvez contourner cette limitation en tuyant toute la commande à PSQL:

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

remarque: Je suis tombé sur ce problème moi-même sur MS Windows et j'ai déjà eu quelque chose à nourrir dans la PSQL en utilisant son stdin. Je devais combiner des intrants. Et c'est là que ça devient très délicat. J'ai pensé partager un exemple quelque peu précieux dans mon exemple d'opinion, outre la réponse d'Erwin, alors je l'affiche ici comme une réponse au cas où une autre personne a également besoin de "utiliser une variable" avec \copy Tout en alimiant les données dans STDIN sur la plate-forme Windows.

Si vous souhaitez copier des données de Stdin et utilisez "Variable" pour \copy Dans le même temps, les choses peuvent devenir difficiles avec des parenthèses s'échappant. Vous trouverez ci-dessous un exemple de la façon dont cela peut être fait. NOTE Triple (sic!) Caret Escape Pour les parenthèses Noms de colonne Scoping

@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
2
mlt