it-swarm.it

PostgreSQL: come passare i parametri dalla riga di comando?

Ho una query un po 'dettagliata in uno script che utilizza ? segnaposto. Volevo testare questa stessa query direttamente dalla riga di comando psql (fuori dallo script). Voglio evitare di entrare e sostituire tutti i ? con valori effettivi, invece vorrei passare gli argomenti dopo la query.

Esempio:

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

Alla ricerca di qualcosa come:

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

Puoi usare il costrutto -v ad es

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

e quindi fare riferimento alle variabili in sql come: v1,: v2 ecc

select * from table_1 where id = :v1;

Prestare attenzione al modo in cui passiamo il valore stringa/data utilizzando due virgolette " '...' "

151
Gavin

Scoperto in PostgreSQL, puoi PREPARE istruzioni proprio come puoi in un linguaggio di scripting. Sfortunatamente, non puoi ancora usare ?, ma puoi usare $n notazione.

Utilizzando l'esempio sopra:

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

In psql c'è un meccanismo tramite il

\set name val

comando, che dovrebbe essere legato al -v name=val opzione da riga di comando. La citazione è dolorosa, nella maggior parte dei casi è più facile inserire qui l'intera carne di query all'interno di un documento Shell.

Modificare

oops, avrei dovuto dire -v invece di -P (che è per le opzioni di formattazione) la risposta precedente ha fatto bene.

11
wildplasser

Puoi anche passare i parametri dalla riga di comando psql o da un file batch. Le prime dichiarazioni raccolgono i dettagli necessari per la connessione al database.

Il prompt finale richiede i valori del vincolo, che verranno utilizzati nella clausola IN () della colonna WHERE. Ricorda di virgoletta singola se stringhe e separalo con una virgola:

@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

Ora nel tuo file di codice SQL, aggiungi il token v1 nella clausola WHERE o in qualsiasi altro punto dell'SQL. Si noti che i token possono essere utilizzati anche in un'istruzione SQL aperta, non solo in un file. Salvalo come test.sql:

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

In Windows, salvare l'intero file come file DOS BATch (.bat), salvare test.sql nella stessa directory e avviare il file batch.

Grazie per Dave Page, di EnterpriseDB, per lo script richiesto originale.

6
MAbraham1

Sembrerebbe che ciò che chiedi non può essere fatto direttamente dalla riga di comando . Dovrai usare una funzione definita dall'utente in plpgsql o chiamare la query da un linguaggio di scripting (e quest'ultimo approccio rende un po 'più semplice evitare l'iniezione di SQL).

2
user554546