J'ai une requête un peu détaillée dans un script qui utilise des ?
espaces réservés. Je voulais tester cette même requête directement depuis la ligne de commande psql (en dehors du script). Je veux éviter d'entrer et de remplacer tous les ?
par des valeurs réelles, au lieu de cela, j'aimerais 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' };
postgresql
parameters
vol7ron
la source
la source
Réponses:
Vous pouvez utiliser la construction -v par exemple
puis faites référence aux variables dans sql comme suit: v1,: v2 etc.
Veuillez faire attention à la façon dont nous transmettons la valeur de chaîne / date en utilisant deux guillemets
" '...' "
la source
\set v3 'another value'
. N'oubliez pas que lorsque vous devez citer la valeur dans une instruction SQL, utilisez des apostrophes autour du nom de la variable, comme ceci:SELECT * FROM foo WHERE bar = :'v3';
awk
psql -v v1=12 -v v2="'Hello World'" -v v3="'2010-11-12'" -c 'select * from table_1 where id = :v1;'
générera une erreur de syntaxe. Cependant, si bash est votre shell, vous pouvez essayer:psql -v v1=12 -v v2="'Hello World'" -v v3="'2010-11-12'" <<< 'select * from table_1 where id = :v1;'
avec succès.Trouvé dans PostgreSQL, vous pouvez faire des
PREPARE
déclarations comme vous pouvez le faire dans un langage de script. Malheureusement, vous ne pouvez toujours pas utiliser?
, mais vous pouvez utiliser la$n
notation.En utilisant l'exemple ci-dessus:
la source
foo
est occupé et un autrePREPARE
devrait avoir un autre nom alors que la session en cours n'est pas fermée. Si vous jouez avecPREPARE
danspsql
il est difficile d'inventer à chaque fois un nouveau nom etDEALLOCATE
peut aider avec elle =)Dans psql, il existe un mécanisme via le
commande, qui est censée être liée au
-v name=val
option de ligne de commande. La citation est pénible, dans la plupart des cas, il est plus facile de mettre toute la viande de requête dans un shell ici-document.Éditer
oups, j'aurais dû dire
-v
au lieu de-P
(ce qui est pour les options de formatage) la réponse précédente avait raison.la source
Vous pouvez également transmettre les paramètres sur la ligne de commande psql ou à partir d'un fichier de commandes. Les premières instructions 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 colonne IN (). N'oubliez pas de placer les chaînes entre guillemets simples et séparez-les par une virgule:
Maintenant, dans votre fichier de code SQL, ajoutez le jeton v1 dans votre clause WHERE, ou n'importe où ailleurs dans le SQL. Notez que les jetons peuvent également être utilisés dans une instruction SQL ouverte, pas seulement dans un fichier. Enregistrez-le sous test.sql:
Sous Windows, enregistrez le fichier entier en tant que fichier DOS BATch (.bat), enregistrez le test.sql dans le même répertoire et lancez le fichier de commandes.
Merci à Dave Page, d'EnterpriseDB, pour le script original.
la source
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 permet d'éviter un peu plus facilement l'injection SQL).
la source