2012-09-21 8 views
7

Per esempio, ho un valore di tabella contiene:Conservare PostgreSQL risultato di una query a Shell o PostgreSQL variabile

select * from myvalue; 

    val 
------- 
12345 
(1 row) 

Come posso salvare questo 12345 in una variabile in PostgreSQL o script di shell?

Ecco quello che ho provato nel mio script di shell:

var=$(psql -h host -U user -d db <<SQLSTMT 
SELECT * FROM myvalue; 
SQLSTMT) 

ma echo $var mi dà:

val ------- 12345 (1 row) 

Ho anche provato

\set var (select * from myvalue) 

in psql e quando si digita \set elenca:

var = '(select*frommyvalue)' 

risposta

11

No, no, no! Utilizzare "dati grezzi" passaggio da psql, come "-t" o "\ t" e tubo la query a psql invece di parsing ascii-tavolo, vieni :-)

echo 'select * from myvalue;' | psql -t -h host -U user -d db 

Se davvero bisogno di analizzare psql output, potresti anche usare -H switch (attiva l'output HTML) e analizzarlo con un po 'di modulo perl per analizzare le tabelle html, l'ho usato una o due volte. Inoltre, potresti voler usare uno pgpass file e ~/.psqlrc per alcune impostazioni predefinite , come il DB predefinito da connettere, quando non specificato.

+2

Come @ scott-marlowe ha detto, -A rimuove l'allineamento di output della tabella. Aggiungi questo flag per un singolo output. –

1

È possibile filtrare il risultato che si ottiene con il vostro comando psql:

var=$(psql -h host -U user -d db <<SQLSTMT 
SELECT * FROM myvalue; 
SQLSTMT) 
var=$(cut -d' ' -f3 <<<$var) 
6

psql ha un'opzione -c/--command= accettare SQL dalla riga di comando, e -t/--tuples-only opzione per controllare formattazione dell'output.

$ psql -c 'select 1+1' 
?column? 
---------- 
     2 
(1 row) 
$ psql -t -c 'select 1+1' 
     2 

$ VALUE=`psql -t -c 'select 1+1'` 
$ echo $VALUE 
2 
1

In this answer Spiego un modo per farlo, utilizzando un co-processo per comunicare avanti e indietro con psql. Questo è eccessivo se tutto ciò che serve è eseguire una query e ottenere un singolo risultato, ma potrebbe essere utile sapere se si sta eseguendo lo scripting della shell con psql.

3
var=`psql -Atc "select 1;"` 
echo $var 
1 
Problemi correlati