2009-10-28 25 views
31

Ho bisogno di una variabile per contenere i risultati recuperati dal database. Finora questo è fondamentalmente quello che sto cercando senza successo.script bash - selezionare dal database alla variabile

myvariable=$(mysql database -u $user -p $password | SELECT A, B, C FROM table_a) 

La mia comprensione dei comandi di bash non è molto buona, come potete vedere.

risposta

33

Non so molto circa l'interfaccia della riga di comando di MySQL, ma supponendo che solo bisogno di aiuto con il colpire, si dovrebbe cercare di scambiare sia i comandi in giro in questo modo:

myvariable=$(echo "SELECT A, B, C FROM table_a" | mysql database -u $user -p$password) 

che ECHOS la stringa in MySQL. In alternativa, si può essere più di fantasia e utilizzare alcune nuove bash-caratteristiche (la stringa) qui

myvariable=$(mysql database -u $user -p$password<<<"SELECT A, B, C FROM table_a") 

conseguente la stessa cosa (supponendo che si sta utilizzando una versione recente di bash abbastanza), senza coinvolgere eco.

Si noti che la password -p $ non è un errore di battitura, ma è il modo in cui MySQL si aspetta che le password vengano immesse tramite la riga di comando (senza spazio tra l'opzione e il valore).

Si noti che myvariable conterrà tutto ciò che MySQL emette sullo standard output (di solito tutto tranne i messaggi di errore), comprese le intestazioni di tutte le colonne, i frame ASCII artistici e così via, che possono o meno essere ciò che si desidera.

EDIT:
Come è stato notato, sembra che vi sia un parametro -e a MySQL, mi piacerebbe andare per quella, sicuramente.

+0

Grazie, anche il comando mysql non mi piaceva il -p .. Avevo bisogno di usare --password = $ password. – imnotneo

+1

Puoi anche aggiungere un file di configurazione (chiamato .my.cnf) alla tua cartella Inizio che inserirà automaticamente le tue opzioni. Ciò farebbe risparmiare un po 'di confusione nello script – Yitzchak

+0

+1 di .my.cnf, in particolare per ottenere le password dagli script. L'opzione -N è utile per tagliare i nomi dei campi. – ErichBSchulz

12

Hai il tubo viceversa ed è necessario eco la query, in questo modo:

myvariable=$(echo "SELECT A, B, C FROM table_a" | mysql db -u $user -p $password) 

Un'altra alternativa è quella di utilizzare solo il client mysql, come questo

myvariable=$(mysql db -u $user -p $password -se "SELECT A, B, C FROM table_a") 

(-s è necessario per evitare l'arte ASCII)

Ora, BASH non è la lingua più appropriata per gestire questo tipo di scenari, in particolare la gestione delle stringhe a nd splitting risultati SQL e simili. Devi lavorare molto per ottenere cose che sarebbero molto, molto semplici in Perl, Python o PHP.

Ad esempio, come otterrete ciascuna di A, B e C sulla propria variabile? È certamente fattibile, ma se non capisci pipe ed echo (cose di shell molto semplici), non sarà un compito facile da fare, quindi se possibile userei una lingua più adatta.

44

un modo più diretto potrebbe essere:

myvar=$(mysql mydatabase -u $user -p$password -se "SELECT a, b, c FROM table_a") 
+5

Stavo cercando il parametro s, anche se è necessario fornirlo due volte per sopprimere i nomi delle colonne da stampare –

+0

Questa è la risposta migliore, non restituisce il nome della colonna! – user3479125

+1

Penso che lo spazio bianco tra '-p' e la password deve essere rimosso. – frb

14

Per leggere la linea per linea i dati in un array Bash si può fare questo:

while read -a row 
do 
    echo "..${row[0]}..${row[1]}..${row[2]}.." 
done < <(echo "SELECT A, B, C FROM table_a" | mysql database -u $user -p $password) 

O in variabili individuali:

+0

'Errore di sintassi vicino a un token imprevisto' <' cut.sh: riga 26: 'done <<' – thevoipman

+0

@thevoipman: È probabile che il tuo script non stia usando Bash. Cosa dice il tuo shebang? Inoltre, poiché non riesco a vedere il tuo script, non riesco a vedere dove potrebbe essere l'errore. –

+0

@thevoipman La sostituzione del processo sembra essere il tuo problema (sì, lo so, un anno fa, solo se qualcuno viene a cercare), ma potrebbe essere possibile fare il contrario usando una pipeline invece in qualsiasi shell che stai usando, cioè 'eco ... | mysql ... | mentre leggi -a riga; fare ...; done'. Tieni presente che mentre il corpo è in una subshell e non influenzerà la shell attorno ad esso. – falstro

3
myvariable=$(mysql database -u $user -p$password | SELECT A, B, C FROM table_a) 

senza lo spazio vuoto dopo -p. È banale, ma senza non funzionare.

0
myvariable=$(mysql -u user -p'password' -s -N <<QUERY_INPUT 
    use databaseName; 
    SELECT fieldName FROM tablename WHERE filedName='fieldValue'; 
QUERY_INPUT 
) 
echo "myvariable=$myvariable" 
+0

Quando si fornisce il codice che risolve il problema, è meglio dare almeno una breve spiegazione di come funziona in modo che la lettura della gente non debba analizzarla mentalmente per linea per capire le differenze. – Fluffeh

5

Se si desidera utilizzare un singolo valore d'uso bash:

companyid=$(mysql --user=$Username --password=$Password --database=$Database -s --execute="select CompanyID from mytable limit 1;"|cut -f1) 

    echo "$companyid" 
+0

questo legge veramente il singolo valore nella variabile – bebbo

0

Un altro esempio, quando il nome della tabella o il database contiene caratteri non supportati, come uno spazio, o '-'

db='data-base' 

db_d='' 
db_d+='`' 
db_d+=$db 
db_d+='`' 

myvariable=`mysql --user=$user --password=$password -e "SELECT A, B, C FROM $db_d.table_a;"` 
0

Se si dispone di un nome di database particolare e di un host su cui si desidera eseguire la query, attenersi alla seguente query:

outputofquery = $ (mysql -u "$ dbusername" -p "$ passworddb" -h "$ dbHostName" -e "SELECT A, B, C DA table_a;" $ dbname)

Quindi, per eseguire le query mysql è necessario installare il client mysql su linux

Problemi correlati