web-dev-qa-db-fra.com

PostgreSQL: Comment passer des paramètres en ligne de commande?

J'ai une requête assez détaillée dans un script qui utilise ? espaces réservés. Je voulais tester cette même requête directement à partir de la ligne de commande psql (en dehors du script). Je veux éviter d'entrer et de remplacer tous les ? avec les valeurs réelles, j'aimerais plutôt passer les arguments après la requête.

Exemple:

SELECT  * 
FROM    foobar
WHERE   foo = ?
   AND  bar = ?
    OR  baz = ?  ;

Vous cherchez quelque chose comme:

%> {select * from foobar where foo=? and bar=? or baz=? , 'foo','bar','baz' };
75
vol7ron

Vous pouvez utiliser la construction -v, par exemple

psql -v v1=12  -v v2="'Hello World'" -v v3="'2010-11-12'"

et puis se référer aux variables dans SQL comme: v1,: v2 etc

select * from table_1 where id = :v1;

Veuillez faire attention à la façon dont nous passons chaîne/date en utilisant deux guillemets " '...' "

151
Gavin

Découvert dans PostgreSQL, vous pouvez instructions PREPARE comme vous le pouvez dans un langage de script. Malheureusement, vous ne pouvez toujours pas utiliser ?, mais vous pouvez utiliser $n notation.

En utilisant l'exemple ci-dessus:

PREPARE foo(text,text,text) AS
    SELECT  * 
    FROM    foobar
    WHERE   foo = $1
       AND  bar = $2
        OR  baz = $3  ;
EXECUTE foo('foo','bar','baz');
DEALLOCATE foo;
27
vol7ron

Dans psql, il existe un mécanisme via le

\set name val

commande, qui est supposée être liée à la -v name=val option de ligne de commande. Citer est pénible. Dans la plupart des cas, il est plus facile de mettre toute la requête dans un document Shell.

Modifier

oups, j'aurais dû dire -v au lieu de -P (pour les options de formatage) la réponse précédente a eu raison.

11
wildplasser

Vous pouvez également transmettre les paramètres à la ligne de commande psql ou à partir d'un fichier de commandes. Les premières déclarations rassemblent les détails nécessaires à la connexion à votre base de données.

La dernière invite demande les valeurs de contrainte, qui seront utilisées dans la clause WHERE column IN (). Rappelez-vous de guillemets simples si des chaînes et séparez-les par une virgule:

@echo off
echo "Test for Passing Params to PGSQL"
SET server=localhost
SET /P server="Server [%server%]: "

SET database=amedatamodel
SET /P database="Database [%database%]: "

SET port=5432
SET /P port="Port [%port%]: "

SET username=postgres
SET /P username="Username [%username%]: "

SET /P bunos="Enter multiple constraint values for IN clause [%constraints%]: "
ECHO you typed %constraints%
PAUSE
REM pause
"C:\Program Files\PostgreSQL\9.0\bin\psql.exe" -h %server% -U %username% -d %database% -p %port% -e -v v1=%constraints% -f test.sql

Maintenant, dans votre fichier de code SQL, ajoutez le jeton v1 dans votre clause WHERE ou ailleurs dans le code SQL. Notez que les jetons peuvent également être utilisés dans une instruction SQL ouverte, pas seulement dans un fichier. Enregistrez ceci sous test.sql:

SELECT * FROM myTable
WHERE NOT someColumn IN (:v1);

Sous Windows, enregistrez le fichier entier en tant que fichier BATch DOS (.bat), enregistrez le fichier test.sql dans le même répertoire et lancez le fichier de traitement par lots.

Merci à Dave Page, de EnterpriseDB, pour le script d’invite original.

6
MAbraham1

Il semblerait que ce que vous demandez ne peut pas être fait directement à partir de la ligne de commande . Vous devrez soit utiliser une fonction définie par l'utilisateur dans plpgsql, soit appeler la requête à partir d'un langage de script (et cette dernière approche facilite un peu l'évitement de l'injection SQL).

2
user554546