Mysql
 sql >> Database >  >> RDS >> Mysql

Un modo semplice e veloce per migrare SQLite3 su MySQL?

Tutti sembrano iniziare con alcune espressioni greps e perl e in qualche modo ottieni qualcosa che funziona per il tuo particolare set di dati ma non hai idea se sono stati importati i dati correttamente o meno. Sono seriamente sorpreso che nessuno abbia creato una solida libreria in grado di convertire tra i due.

Ecco un elenco di TUTTE le differenze nella sintassi SQL che conosco tra i due formati di file:Le righe che iniziano con:

  • INIZIA LA TRANSAZIONE
  • IMPEGNA
  • sequenza_sqlite
  • CREA INDICE UNICO

non vengono utilizzati in MySQL

  • SQLite usa CREATE TABLE/INSERT INTO "table_name" e MySQL usa CREATE TABLE/INSERT INTO table_name
  • MySQL non usa le virgolette all'interno della definizione dello schema
  • MySQL usa virgolette singole per le stringhe all'interno di INSERT INTO clausole
  • SQLite e MySQL hanno diversi modi per eseguire l'escape delle stringhe all'interno di INSERT INTO clausole
  • SQLite usa 't' e 'f' per i booleani, MySQL usa 1 e 0 (una semplice espressione regolare per questo può fallire quando hai una stringa del tipo:'Sì, non lo fai' all'interno del tuo INSERT INTO )
  • SQLLite utilizza AUTOINCREMENT , MySQL usa AUTO_INCREMENT

Ecco uno script perl modificato molto semplice che funziona per mio set di dati e controlla molte più di queste condizioni rispetto ad altri script perl che ho trovato sul web. Nu garantisce che funzionerà con i tuoi dati, ma sentiti libero di modificare e pubblicare di nuovo qui.

#! /usr/bin/perl

while ($line = <>){
    if (($line !~  /BEGIN TRANSACTION/) && ($line !~ /COMMIT/) && ($line !~ /sqlite_sequence/) && ($line !~ /CREATE UNIQUE INDEX/)){
        
        if ($line =~ /CREATE TABLE \"([a-z_]*)\"(.*)/i){
            $name = $1;
            $sub = $2;
            $sub =~ s/\"//g;
            $line = "DROP TABLE IF EXISTS $name;\nCREATE TABLE IF NOT EXISTS $name$sub\n";
        }
        elsif ($line =~ /INSERT INTO \"([a-z_]*)\"(.*)/i){
            $line = "INSERT INTO $1$2\n";
            $line =~ s/\"/\\\"/g;
            $line =~ s/\"/\'/g;
        }else{
            $line =~ s/\'\'/\\\'/g;
        }
        $line =~ s/([^\\'])\'t\'(.)/$1THIS_IS_TRUE$2/g;
        $line =~ s/THIS_IS_TRUE/1/g;
        $line =~ s/([^\\'])\'f\'(.)/$1THIS_IS_FALSE$2/g;
        $line =~ s/THIS_IS_FALSE/0/g;
        $line =~ s/AUTOINCREMENT/AUTO_INCREMENT/g;
        print $line;
    }
}