Via Lattanzio,23 Milano
+39 02 36592025
info@synaptica.info

Sqlite2Mysql

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!

Sqlite2Mysql

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 !!!!

Tags: , , , , , , , , ,