2010-10-10 19 views
15

Ho cercato di ottenere uno script di shell (bash) per inserire una riga in un database remoto, ma ho avuto qualche problema :(Utilizzando script di shell per inserire i dati in database MySQL remoto

Il Lo script ha lo scopo di caricare un file su un server, ottenere un URL, HASH e un file, connettersi a un database mysql remoto e inserire i dati in una tabella esistente. Ho funzionato fino al bit del database MySQL remoto.

Ecco come si presenta:

#!/bin/bash 

zxw=randomtext 
description=randomtext2 

for file in "[email protected]" 
do 
echo -n ***** 
ident= ***** 
data= **** 
size=` **** 
hash=`**** 
mysql --host=randomhost --user=randomuser --password=randompass randomdb 
insert into table (field1,field2,field3) values('http://www.site.com/$hash','$file','$size'); 
echo "done" 
done 

sono un noob totale alla programmazione così y: P

Ad ogni modo, ho aggiunto il \ per sfuggire alle parentesi mentre ricevevo degli errori. Come è adesso, lo script funziona fino a quando non si connette al database mysql. Si collega semplicemente al database mysql e non esegue il comando di inserimento (e non so nemmeno se il comando di inserimento funzionerebbe in bash).

PS: Ho provato entrambi i comandi mysql dalla riga di comando uno per uno, e hanno funzionato, anche se ho definito l'hash/file/dimensione e non ho avuto l'escape "\".

Ad ogni modo, cosa ne pensate voi ragazzi? È ciò che sto cercando di fare anche possibile? Se é cosi, come?

Qualsiasi aiuto sarebbe apprezzato :)

risposta

29

L'istruzione di inserimento deve essere inviata a mysql, non un'altra riga nello script di shell, quindi è necessario impostarlo come "documento qui".

mysql --host=randomhost --user=randomuser --password=randompass randomdb << EOF 
insert into table (field1,field2,field3) values('http://www.site.com/$hash','$file','$size'); 
EOF 

I << EOF mezzi prendere tutto prima della riga successiva che contiene nulla, ma EOF (senza spazi bianchi all'inizio) come standard input al programma.

+0

Ottenere questo errore: riga 22: avviso: qui-documento alla riga 19 delimitato da fine file (voluto 'EOF ') riga 23: riga 23: errore di sintassi: fine imprevista del file – lelouch

+2

@lelouch - sei uscito fuori da "EOF" nella terza riga sopra. È importante implementare tutta la soluzione, non solo la prima metà. –

+0

Hmm nah, ho aggiunto chiaramente il << EOF nella riga mysql e un altro EOF in una nuova riga dopo l'inserto. Qualche idea su cosa è sbagliato? – lelouch

5

Non utilizzare SQL prime da bash; bash non ha una struttura sana per sanificare i dati in anticipo. Genera un file CSV e caricalo invece.

+0

È pensato per essere completamente automatizzato con molti file che attraversano questo processo. Se utilizzo un file CSV o qualcosa del genere, ciò non porterà a una possibilità di voci duplicate degli stessi dati? -> scusa la mia possibile ignoranza! – lelouch

+0

Se avete bisogno di un campo o un certo insieme di campi per essere unico per tutto il tavolo, allora si dovrebbe creare un indice univoco. –

+1

Vorrei aggiungere che un'altra risposta sullo stack dice di non usare un file csv.Se sei connesso a un database MySQL remoto, è difficile generare il csv localmente. Devi trovare un modo per generare il csv in remoto e poi trasferirlo nella directory locale. L'altra risposta consigliata tubazioni. Quindi qual è? Usiamo CSV o no ?! – obesechicken13

11

Questo potrebbe non essere esattamente quello che stai cercando, ma è un'opzione.

Se si desidera aggirare il fastidio di includere effettivamente la query nello script sh, è possibile salvare la query come file .sql (utile a volte quando la query è DAVVERO grande e complicata). Questo può essere fatto con un semplice file IO in qualunque lingua tu stia usando.

allora si può semplicemente includere nel vostro sh bisaccia qualcosa come:

mysql -u youruser -p yourpass -h remoteHost < query.sql & 

Questo si chiama l'esecuzione in modalità batch. Opzionalmente, puoi includere la e commerciale alla fine per assicurarti che quella linea dello script sh non blocchi.

Anche se si sono preoccupati per gli stessi dati ottenendo inseriti più volte e RDBMS ottenere incoerente, si dovrebbe esplorare le transazioni MySql (commit, rollback, ecc).

+1

Questa risposta funziona per me. Uscita davvero pulita. – obesechicken13

Problemi correlati