Sqlite2Mysql
Ovvero come convertire un database SQLite in un database MySQL
- Case Study: Un database sqlite3 da 830Mb da importare in SAS (Fortuna che è lite :P)
- Tempo di Cottura: 45Minuti con una CPU Core a 2Ghz e un disco a 5400rpm
- Avvertenze : si da per assunto che sia sqlite che mysql siano installati sulla macchina!
L’obiettivo della nostra ricetta sarà sia il database schema che i dati:
Per comodità esporteremo il tutto come statement sql (92?)Â : apriamo un terminale,
portiamoci nella directory dove è presente il db sqlite e cominciamo con
sqlite3 database.sqlite .dump > dump.sql
Ora che abbiamo ottenuto il dump (dump.sql) dobbiamo ripulirlo in modo che mysql lo digerisca; su un file piccolo basterebbe il [inserisci quì il tuo editor preferito] (aka notepad/vi/nano/gedit etc…) ma su un file da 760Mb vi assicuro che conviene utilizzare la riga di comando.
Ci sarà d’aiuto il comando sed (che sta per Stream EDitor) per saperne di più potete dare un man sed
oppure andare su wikipedia
Quindi con questo tool rimuoviamo i commenti che non piacciono a mysql ovvero tutte le linee che contengono una coppia di “-”
esempio di commento:
-- i'm a sql single line comment
time sed -i "/^.*--.*$/d" dump.sql
Gestite e convertite come preferite i tipi di campo di sqlite in base ai dati contenuti nei campi:
io avevo solo campi TEXT con dati lunghi massimo 50 caratteri, quindi ho sostituito il tipo TEXT di sqlite con un VARCHAR(50)
time sed -i "s/TEXT/VARCHAR\(50\)/g" dump.sql
Ancora non funziona ma manca poco
Rimuoviamo il doppio apice prima del nome della tabella nelle insert (se avete nomi con spazi mettete l’apice singolo dopo “INTO ” )
time sed -i "s/INTO.\"/INTO/g" dump.sql
Rimuoviamo anche il doppio apice dopo del nome della tabella nelle insert (se avete nomi con spazi mettete l’apice singolo invece dello spazio)
time sed -i "/INSERT/s,\", ," dump.sql
Prepariamo la tavola creando un nuovo database in mysql:
time mysql --force --user=:USER --password=:PASSWORD < "create database :DATABASE;"
Portiamo i piatti in tavola importando gli statement ripuliti con:
time mysql --force --user=:USER --password=:PASSWORD :DATABASE < dump.sql
Buon appentito !!!!