| Lezione Precedente | Elenco Lezioni | Lezione Successiva |
Inserire i dati con i comandi INSERT INTO ... VALUES o con un client grafico è abbastanza complesso, ed in genere adatto quando i valori da inserire non sono eccessivamente numerosi. Se i dati sono però già disponibili, magari in un altro formato, esistono dei modi per importarli direttamente, senza doverli riscrivere.
Analogamente, è possibile esportare in formato testo i dati presenti nelle tabelle, in modo da renderli utilizzabili da altri programmi.
aerei vista nelle lezioni precedenti, insieme a tutti i dati in essa contenuti. All'interno dello script vi sono una serie di comandi SQL che abbiamo già incontrato, ma con un paio di novità:Si tratta di due estensioni non standard di MySQL, quindi è bene non utilizzarle all'interno di programmi che potrebbero essere portati a DBMS differenti.
Una volta che uno script è creato, bisogna avere un modo per eseguirlo. In MySQL di modi ce n'è essenzialmente due:\. <nomefile>); mysql con i seguenti parametri: mysql <nome_schema> <
<nomefile>, dove <nome_schema> è il nome dello schema all'interno del quale si vuole eseguire lo script. Il simbolo < tra <nome_schema> e <nomefile> va inserito così com'è, e prende il nome di operatore di redirezione dell'input: dice al sistema operativo che l'input del programma mysql non deve provenire da tastiera, come è normalmente, ma dal file indicato.
In aula informatizzata il comando deve essere ovviamente mysql -h goemon -p <nome_schema> < <nomefile>, dove <nome_schema> è il vostro numero di matricola. Nel seguito, daremo sempre per scontato l'uso delle opzioni -h e -p quando necessarie.
USE necessario a selezionare lo schema opportuno. In tal caso, si può omettere il nome dello schema dalla riga di comando del programma mysql e usare semplicemente mysql < <nomefile>.Per mysqldump, come per mysql, occorre utilizzare le opzioni -h e -p quando si lavora in aula informatizzata.
Il carattere > prende il nome di operatore di redirezione dell'output. È il duale dell'operatore <. Indica al sistema operativo di non inviare l'output sulla finestra del terminale, ma su di un file. Il file che si è ottenuto può essere letto con il
comando SOURCE
da dentro il monitor di MySQL. Bisogna prima ricordarsi di selezionare lo schema in cui si vogliono
inserire i dati con il comando USE. Alternativamente, dalla shell di Linux possiamo usare mysql
<nome_schema>
< <nome_file>.
Con la sintassi
mysqldump <nome_schema> --databases
<db1>...<dbn>
si può effettuare il dump di più schemi contemporaneamente. In questo modo mysqldump
genera anche i comandi CREATE DATABASE (che, se ricordate, è un sinonimo di CREATE SCHEMA) necessari per la creazione degli schemi ed i comandi USE.
Il file generato può essere letto con il monitor di MySQL, sempre
con
il comando SOURCE,
o dalla shell con mysql
< <nomefile>.
Esportare i dati con mysqldump
e rileggerli da un altra macchina è il modo migliore
per trasferire dati da un sistema ad un altro, in quanto funziona
indipendentemente dal tipo di sistema operativo o processore utilizzato
nei due sistemi.
Prima di andare avanti, facciamo notare brevemente che gli operatori di redirezione < e > non sono specifici di MySQL, ma si possono applicare a qualsiasi programma eseguibile dalla shell di Linux. Ad esempio, mentre normalmente il programma ls visualizza su schermo il contenuto di una directory, un comando come ls > catalogo non visualizza nulla, ma crea un file di nome catalogo il cui contenuto è l'elenco generato da ls.
Notare che alcune volte l'uso della redirezione cambia leggermente il funzionamento dei programmi. Ad esempio, l'output di ls e di ls > catalogo non è esattamente uguale. L'output di ls è a colori, e i file sono visualizzati su più colonne. Il file catalogo ottenuto da ls > catalogo non ha colori e presenta i file su di una sola colonna.
Di contro, l'output su schermo di mysqldump è esattamente identico a quello che si ottiene se lo si redirige su un file.
LOAD DATA LOCAL INFILESupponiamo ora di voler aggiungere altri elementi alla tabella aerei, e di avere i dati in un file datiaerei.txt. Notare che nel file sono presenti gli stessi campi della tabella (eccetto id e commento): ogni campo è separato da un altro da una tabulazione (attenzione una tabulazione, non uno spazio), e ogni riga rappresenta una nuova istanza.
commento viene automaticamente settato a NULL che è il valore di default.<number> righe.+----+------------+------------------+------------+----------+---------+ | id | produttore | modello | dataimm | numposti | charter | +----+------------+------------------+------------+----------+---------+ | 1 | boeing | 747 | 2000-10-10 | 350 | n | | 2 | MDD | Super80 | NULL | NULL | n | | 3 | boeing | 747m | 2000-01-01 | 200 | n | | 4 | boeing | 747m | 2000-01-01 | 200 | n | | 5 | airbus | b200 | NULL | NULL | n | | 6 | xyz | concorde | 1980-07-03 | 110 | n | | 7 | xyz | columbia shuttle | 1999-06-04 | 5 | n | | 8 | boeing | B600 | 1920-02-23 | NULL | n | +----+------------+------------------+------------+----------+---------+
Un file come datiaerei2.txt si dice essere in formato CSV (Comma Separated Values). In realtà, si usa il nome di formato CSV anche per un file come datiaerei.txt, nel quale i dati non sono separati da virgole ma da tabulazioni. In generale con formati CSV si intende un qualunque formato tabellare in cui ogni riga contiene una istanza, e gli attributi delle istanze sono separate da qualche carattere separatore (che può essere virgola, tabulazione, spazio, punto e virgola o altro).


aerei.csv, si possono importare i dati in MySQL con il
comandoVeniamo ora al problema opposto: vogliamo spostare i dati presenti in una tabella in un foglio di calcolo, o in un altro software che non intepreta il linguaggio SQL ma accetta file in formato CSV. Come fare a generare il tipo di file richiesto? Utilizziamo di nuovo l'operatore < per la redirezione dell'input.
Supponiamo di voler esportare in formato CSV il contenuto della tabella aerei. Prepariamo uno script SQL contenente il comando SELECT * FROM AEREI; . Supponiamo che questo file si chiami comando.sql. Adesso dalla shell di Linux diamo il seguente comando (con l'aggiunta degli opportuni parametri di connessione):
mysql gamato < comando.sql
Il programma monitor di MySQL si collega allo schema gamato, esegue il comando SELECT * FROM aerei e visualizza il seguente output sullo schermo, ritornando immediatamente alla shell di Linux:
id produttore modello dataimm numposti commento 1 boeing 747 2000-10-10 350 2 MDD Super80 NULL NULL prova 3 boeing 747m 2000-01-01 200 NULL 4 boeing 747m 2000-01-01 200 NULL 5 airbus b200 NULL NULL NULL 6 xyz concorde 1980-07-03 110 NULL 7 xyz columbia shuttle 1999-06-04 5 NULL 8 boeing B600 1920-02-23 NULL NULL 9 cessna b71 1920-02-12 2 NULL 10 cessna b72 1930-02-02 4 NULL
Possiamo combinare la redirezione dell'input con quella dell'output e inviare il risultato ad un file, da utilizzare poi in OpenOffice, MySQL o in qualunque altro programma che legga i file CSV:
mysql gamato < comando.sql > out.csv
Scrivere un file di testo con il comando SQL da eseguire e poi invocare il programma mysql può essere un po' farraginoso. Fortunatamente si può fare tutto con la sola invocazione di mysql utilizzando l'opzione aggiuntiva -e. Questa consente di eseguire un comando SQL, specificato tra virgolette dopo -e, in maniera non interattiva. Ad esempio:
mysql gamato -e "SELECT * FROM aerei" > out.csv
ha esattamente lo stesso effetto del comando mysql gamato < comando.sql > out.csv visto precedentemente.
Se invece l'output di mysql con l'opzione -e non viene rediretto ma viene inviato normalmente sullo schermo, allora avremo questo risulato:
+----+------------+------------------+------------+----------+----------+ | id | produttore | modello | dataimm | numposti | commento | +----+------------+------------------+------------+----------+----------+ | 1 | boeing | 747 | 2000-10-10 | 350 | | | 2 | MDD | Super80 | NULL | NULL | prova | | 3 | boeing | 747m | 2000-01-01 | 200 | NULL | | 4 | boeing | 747m | 2000-01-01 | 200 | NULL | | 5 | airbus | b200 | NULL | NULL | NULL | | 6 | xyz | concorde | 1980-07-03 | 110 | NULL | | 7 | xyz | columbia shuttle | 1999-06-04 | 5 | NULL | | 8 | boeing | B600 | 1920-02-23 | NULL | NULL | | 9 | cessna | b71 | 1920-02-12 | 2 | NULL | | 10 | cessna | b72 | 1930-02-02 | 4 | NULL | +----+------------+------------------+------------+----------+----------+
Le linee orizzontali e verticali aiutano un essere umano nella lettura del file ma non sono interpretate dai programmi che leggono il formato CSV. Questo non è comunque un problema perché, se l'output viene rediretto su un file come è stato fatto prima, allora cambia e diventa un file CSV standard.
Tutta quello che è scritto in questa sezione non è applicabile in aula informatizzata, perché la macchina dove risiede il server MySQL non è accessibile direttamente.
Un altra possibilità per esportare i propri dati è copiare manualmente i file che contengono gli schemi e le tabelle presenti nel server. Il server MySQL conserva tutti i propri dati nella directory/var/lib/mysql. Qui sono presenti varie directory, una per
ogni schema creato nel sistema. Dentro ogni directory, e per ogni tabella,
vi sono tre file: <tabella>.frm,
<tabella>.MYD
e <tabella>.MYI.aerei una nuova tabella che contiene informazioni sui posti a sedere disponibili in ogni aereo. La tabella è composta dai seguenti campi:| Lezione Precedente | Elenco Lezioni | Lezione Successiva |