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