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 INFILE
Supponiamo 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 |