Vous n'êtes pas identifié(e).

#1 30/08/2011 18:55:04

beaud76
Membre

\copy from avec un nom de fichier en variable

Bonjour à tous,

On m'a intérrogé aujourd'hui sur un problème d'utilisation de psql (actuellement en 8.3, demain en 9.0).
Il s'agit de pouvoir utiliser une variable pour spécifier le nom d'un fichier dans une méta commande \copy from.
L'objectif final est d'exécuter le même script psql sur un grand nombre de bases, mais avec des arborescences différentes.

La variable décrivant le nom du fichier est passée par le script schell qui appelle psql (option -v). Là, pas de problème. La variable est bien utilisable, par \echo par exemple

Mais avec la commande \copy, on ne peut directement utiliser :varriable comme nom de fichier. (D'ailleurs je ne comprends pas bien pourquoi)

Pour un \copy to, une astuce consiste à faire une redirection juste avant la commande, avec \o :variable (et avec \o juste après pour arrêter la redirection) et d'utiliser STDOUT comme nom de fichier dans \copy. En clair :
\o :fichier
\copy <table.ou.requete> to STDOUT
\o

Mais dans l'autre sens, pour un \copy from, je ne trouve pas de solution.
J'ai bien tenté quelques variantes de \copy from STDIN, mais sans résultat.
L'utilisation de pstdin ne m'a rien apporté non plus.

Bref, si quelqu'un a une idée ?

Cordialement.
Philippe.

Hors ligne

#2 30/08/2011 19:05:30

gleu
Administrateur

Re : \copy from avec un nom de fichier en variable

En dehors d'écrire un script bash, perl ou python, non, aucun idée. En tout cas, vous ne pouvez pas utiliser de variable avec \copy.


Guillaume.

Hors ligne

#3 01/09/2011 12:18:24

beaud76
Membre

Re : \copy from avec un nom de fichier en variable

2 choses pour clore le sujet :
- ouf, j'ai compris pourquoi ce ne serait pas une bonne idée que psql fasse la résolution des variables dans les noms de fichier de la commande \copy : on ne pourrait tout simplement plus gérer de fichier dont le nom contiendrait un caractère ':',
- la solution que nous allons mettre en oeuvre va consister à remplacer dans le shell script appelant psql la commande
psql ... -f <script.sql> -v var=...
par une commande
sed 's/:var/.../' <script.sql> | psql ...
Ainsi le fichier script fourni restera unique et la substitution se fera à l'appel de psql.

A+ Philippe.

Hors ligne

Pied de page des forums