2017-02-17 1 views
3

Je dispose d'un fichier sql avec quelques lignes qui ressemblent à ceci:Comment intégrer commande shell plusieurs lignes dans le fichier psql

\set buf `cat example-message.msg | base4 -w0` 
SELECT * FROM run_select(:'buf'); 

Cependant, cela cache le contenu de example-message.msg et rend mon dossier (ce qui est en fait une liste de cas de test) moins lisible que je le voudrais. Idéalement, je serais en mesure de mettre en ligne le contenu de example-message.msg. Mais c'est un gros fichier multi-lignes.

J'ai essayé d'utiliser ici-docs:

\set buf `cat <<EOF | base64 -w0 
plan { } 
EOF 
` 

Cependant, ici psql se plaint d'une chaîne entre guillemets et non terminée rétrospectivement the docs disent qu'il ne fonctionnera pas de toute façon. (But in any case, the arguments of a meta-command cannot continue beyond the end of the line.)

Ensuite, je considérais la construction d'une certaine façon la chaîne qui est exécutée:

SELECT $$ 
plan: {} 
$$ AS rawbuf \gset 
\set buf `echo :rawbuf | base64 -w0` 

Cela ne fonctionne pas non plus, pour des raisons évidentes. Mais je ne peux pas sembler en avoir une variation pour travailler non plus. Je suppose que psql doesn't do variable substitution à l'envers.

Y at-il une autre méthode qui me manque?

Répondre

2

Les méta-commandes multi-lignes ne sont en effet pas supportées. Dans votre cas, il semble que ce soit l'aller-retour vers base64 -w0 qui appelle une méta-commande. Mais il semble que vous pouvez éviter cela en faisant le codage base64 dans SQL:

SELECT encode(convert_to($delim$ 
    --multi-line string 
$delim$ 
, 'UTF-8'), 'base64') AS buf \gset 

SELECT * FROM run_select(:'buf'); 

Le :buf temporaire pourrait également être évité si elle n'a pas d'autre usage que d'être réinjecté:

SELECT * FROM run_select(encode(convert_to($delim$ 
    --multi-line string 
$delim$ 
    , 'UTF-8'), 'base64') 
); 
+0

Merci pour la réponse! Alors que vous avez résolu la question comme posée, la commande actuelle que je cours a un pipeline plus long que base64. Je pense que vous avez raison de dire que c'est la seule réponse, j'ai fini par écrire une fonction C qui me permet d'intégrer des chaînes supprimées par $$ comme vous l'avez suggéré. – num1