Script di Bash per inserire valori in MySQL

Voglio fare uno script bash che si connette al mio server MySQL e inserisce qualche valore da un file txt. Ho scritto questo:

#!/bin/bash echo "INSERT INTO test (IP,MAC,SERVER) VALUES ('cat test.txt');" | mysql -uroot -ptest test; 

ma sto ricevendo il seguente errore:

ERRORE 1136 (21S01) alla riga 1: il conteggio delle colonne non corrisponde al conteggio dei valori alla riga 1

Suppongo che l’errore sia nel mio file txt, ma ho provato molte varianti e ancora nessuna speranza di successo.

Il mio file txt ha il seguente aspetto:

10.16.54.29 00: f8: e5: 33: 22: 3f marsara

Prova questo:

 #!/bin/bash inputfile="test.txt" cat $inputfile | while read ip mac server; do echo "INSERT INTO test (IP,MAC,SERVER) VALUES ('$ip', '$mac', '$server');" done | mysql -uroot -ptest test; 

In questo modo lo streaming del file ha letto anche l’esecuzione del comando mysql.

Supponendo che tu abbia molte righe da aggiungere, probabilmente hai bisogno LOAD DATA INFILE , non di INSERT . Il file sorgente deve essere sul server, ma sembra che sia il caso qui.

Qualcosa del genere:

 #!/bin/bash mysql -uroot -ptest test << EOF LOAD DATA INFILE 'test.txt' INTO TABLE tbl_name FIELDS TERMINATED BY ' '; EOF 

LOAD DATA INFILE ha molte opzioni che scoprirai leggendo il documento.

Stai cercando di inserire il valore “cat test.txt” come una stringa nel database in un’istruzione INSERT che richiede 3 parametri (IP, MAC e SERVER), ecco perché ottieni questo messaggio di errore.

È necessario leggere prima il file di testo ed estrarre i valori IP, MAC e Server e quindi utilizzarli nella query che apparirebbe una volta riempita:

 #!/bin/bash echo "INSERT INTO test (IP,MAC,SERVER) VALUES ('10.16.54.29', '00:f8:e5:33:22:3f', 'marsara');" | mysql -uroot -ptest test; 

Io uso questo e funziona:

 mysql -uroot -proot < infile 

o selezionare prima il database

 ./mysql -uroot -proot db_name < infile 

oppure copiare l'intero SQL negli appunti e incollarlo con

 pbpaste > temp_infile && mysql -uroot -proot < temp_infile && rm temp_infile