PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

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

#1 14/01/2021 18:30:22

LECARROU
Membre

Comment lancer un script avec un argument ?

Bonjour,

j'ai un script (script.txt) qui doit comparer 2 tables à l'aide d'une fonction (pharmacy_control(table1,table2)) que je lance dans psql \i 'chemin/vers/script.txt'

j'aimerais passer le nom du fichier utilisé dans le script en paramètre de la commande du genre \i 'chemin/vers/nom_du_script' file='nom_du_fichier'
mais çà ne fonctionne pas : 'invalid argument'


script.txt

DROP TABLE IF EXISTS adm_med_check;
CREATE TABLE IF NOT EXISTS adm_med_check
(med_ide SERIAL, med_num varchar(3), med_pay varchar(3));

\copy adm_med_check(med_num,med_pay) FROM 'D:/Users/jl3/2_ETUDES/18_INTENSETBM/:file WITH CSV HEADER DELIMITER ',' QUOTE '"' NULL AS '';

SELECT * FROM pharmacy_control('adm_med','adm_med_check');

d'avance merci pour votre aide

Hors ligne

#2 15/01/2021 10:47:00

gleu
Administrateur

Re : Comment lancer un script avec un argument ?

Pas très étonnant que vous ayez cette erreur. Il est indiqué nul part que vous pouvez ajouter un deuxième argument à \i.

Bref, le seul moyen d'avoir des variables avec un script psql est d'utiliser \set. Mais comme le dit la documentation, "ni l'interpolation des variables ni la substitution par guillemets inverses ne seront effectuées sur les arguments" (https://docs.postgresql.fr/13/app-psql. … MANDS-COPY).


Guillaume.

Hors ligne

#3 18/01/2021 16:08:24

dverite
Membre

Re : Comment lancer un script avec un argument ?

Les variables n'étant pas interpolées par :copy, si on veut vraiment injecter un nom de fichier variable, on peut générer toute la commande \copy dans une variable et exécuter cette variable. C'est un usage peu connu des variables, mais qui marche.


Hélas il y a une complexité syntaxique non négligeable pour faire ça correctement, parce que les espaces, les apostrophes, les antislash ont des rôles spéciaux dans la syntaxe des méta-commandes.

Par exemple:

\set file 'nomdefichier.csv'
\set customcopy '\\copy adm_med_check(med_num,med_pay) from ''D:/Users/jl3/2_ETUDES/18_INTENSETBM/' :file '''' ' WITH CSV HEADER DELIMITER '','' QUOTE ''"'' NULL AS '''' '
\echo :customcopy

Résultat du \echo :customcopy

\copy adm_med_check(med_num,med_pay) from 'D:/Users/jl3/2_ETUDES/18_INTENSETBM/nomdefichier.csv' WITH CSV HEADER DELIMITER ',' QUOTE '"' NULL AS '' 

On voit que cette commande est propre. Elle serait exécutable simplement avec

:customcopy

Après il faut voir si ça vaut la peine de faire cette usine à échappement (qui suppose aussi que le contenu de :file soit propre, donc de l'échapper aussi surtout s'il vient de l'extérieur), en fonction du contexte...

Hors ligne

Pied de page des forums