2011-12-27 25 views
5

Come si scrive uno script di shell che visualizza i risultati di SQLite? Ho scritto uno script che aggiunge una voce al database SQLite. Ora voglio visualizzare i risultati dopo aver aggiunto quella voce. Ecco il mio script:SQLite per script di shell

echo 'insert into myTable (Date, Details, Category, Average) values (datetime('\''now'\'','\''localtime'\''), '\'''$1''\'', '\'''$2''\'', '$3');'|sqlite3 /Users/user/Documents/Test/dbName.db 

Dopo questo voglio lo script per eco/sputare l'uscita di dichiarazioni:

select sum(Average) from (select * from myTable where Category = 'category1'); 
select sum(Average) from (select * from myTable where Category = 'category2'); 

Il formato dovrebbe essere simile a questo:

Category1 total = <output of first statement> 
Category2 total = <output of second statement> 

Ecco fatto . Sono abbastanza nuovo per SQL e non eccezionale con lo scripting di shell. Sto anche cercando dei buoni tutorial che spieghino problemi come questo.

+1

Dato che non si è "tanto bravi con lo script di shell", probabilmente non si dovrebbero usare gli script di shell per risolvere questo problema. Utilizza qualsiasi sistema di codifica (C++, TCL, python, ...) in cui sei più esperto. Quasi tutto ciò che potresti voler utilizzare ha un'interfaccia disponibile per l'API sqlite. – ravenspoint

+0

@ravenspoint: In realtà, sto gestendo le mie finanze usando SQL, e gli script della shell sono usati per aggiungere rapidamente cose e leggere somme eseguendole da un launcher di script (Quicksilver). – CodeBreaker

+0

Dato che si dice "Sono abbastanza nuovo per SQL", consiglierei di non usare SQL per gestire le vostre finanze! – ravenspoint

risposta

9

Un modo comune per risolvere questo problema è quello di utilizzare una funzione shell chiamato qui il documento, provate questo:

sqlite3 /Users/user/Documents/Test/dbName.dba <<EOS 
    insert into myTable (Date, Details, Category, Average) 
       values(datetime('now','localtime'), '$1', '$2', '$3'); 

    select "Category1 total = " sum(Average) from (
      select * from myTable where Category = 'category1' 
    ); 

    select "Category2 total = " sum(Average) from (
     select * from myTable where Category = 'category2' 
    ); 

EOS 

noti che EOS possono essere qualsiasi stringa che ti piace (penso a EndOfScript), ma deve essere solo sull'ultima riga di testo senza spazi bianchi finali.

Poiché non utilizzo sqlite3, potrebbe essere necessario disporre di alcune parti per chiudere il batch di cui non sono a conoscenza. Inoltre, non sono sicuro che la roba '$ 1' funzionerà, se sqlite3 perdona, prova invece "$ 1", ecc. Inoltre, potrebbe essere necessaria una virgola dopo la stringa "CategoryN total = ".

Nota che questa soluzione ti consente di creare le tue istruzioni DML SQL praticamente quanto vuoi/lunghe. Per cose che accadono regolarmente e che vanno su tabelle di grandi dimensioni, se si dispone delle autorizzazioni per il nostro sistema, è possibile che si desideri che il file DML sia memorizzato in una stored procedure e chiamarlo.

Spero che questo aiuti.

(Se ciò non funziona, modificare il messaggio per indicare la shell in uso, OS/Linux Ver e una versione minima dei messaggi di errore che si ricevono).

+0

Grazie. La logica è perfetta, ma non posso inserire nella tabella (prima istruzione SQL). Il problema riguarda parentesi/virgolette. Le altre dichiarazioni funzionano correttamente. BTW, roba Rs.52 non è nella mia domanda. Ho un'estensione del browser che converte dollari in rupie, quindi i Rs.52 .. sono in realtà segni del dollaro, cioè gli argomenti: dollar1, dollar2, dollar3. In qualche modo, mi sta mostrando i segni del dollaro e altri Rs.52 – CodeBreaker

+0

Puoi quotare la prima EOS, in questo modo: 'sqlite3 dbName.dba << 'EOS'' che [impedisce l'espansione delle variabili della shell] (http://mywiki.wooledge.org/HereDocument) all'interno dell'eredoc. – Wildcard

3

Se è necessario assegnare il risultato sqlite SELECT a una variabile di shell, è possibile farlo.

r=$(sqlite3 your_db_path.db "select something from some_table where condition") 

$r sarà la variabile.

È anche possibile prelevare una singola riga. Puoi fare un po 'di lavoro per dividerlo in un array, potrebbe utilizzare IFS

Inoltre, tieni presente di usare la convenzione #!/bin/bash sopra ogni tuo script di shell. Risolverà molti problemi indesiderati. Alcune volte la convenzione #!/bin/sh dà problemi. :).