Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Schnelle und einfache Möglichkeit, SQLite3 auf MySQL zu migrieren?

Jeder scheint mit ein paar Greps- und Perl-Ausdrücken zu beginnen, und Sie bekommen irgendwie etwas, das für Ihren speziellen Datensatz funktioniert, aber Sie haben keine Ahnung, ob die Daten korrekt importiert wurden oder nicht. Ich bin ernsthaft überrascht, dass niemand eine solide Bibliothek erstellt hat, die zwischen den beiden konvertieren kann.

Hier eine Liste ALLER mir bekannten Unterschiede in der SQL-Syntax zwischen den beiden Dateiformaten:Die Zeilen beginnend mit:

  • TRANSAKTION BEGINNEN
  • VERPFLICHTEN
  • sqlite_sequence
  • EINZIGARTIGEN INDEX ERSTELLEN

werden in MySQL nicht verwendet

  • SQLite verwendet CREATE TABLE/INSERT INTO "table_name" und MySQL verwendet CREATE TABLE/INSERT INTO table_name
  • MySQL verwendet keine Anführungszeichen innerhalb der Schemadefinition
  • MySQL verwendet einfache Anführungszeichen für Zeichenfolgen innerhalb von INSERT INTO Klauseln
  • SQLite und MySQL haben unterschiedliche Möglichkeiten, Zeichenfolgen innerhalb von INSERT INTO zu maskieren Klauseln
  • SQLite verwendet 't' und 'f' für boolesche Werte verwendet MySQL 1 und 0 (Eine einfache Regex dafür kann fehlschlagen, wenn Sie eine Zeichenfolge wie:'I do, you don't' in Ihrem INSERT INTO haben )
  • SQLLite verwendet AUTOINCREMENT verwendet MySQL AUTO_INCREMENT

Hier ist ein sehr einfaches, gehacktes Perl-Skript, das für my funktioniert Datensatz und prüft auf viele weitere dieser Bedingungen als andere Perl-Skripte, die ich im Internet gefunden habe. Nu garantiert, dass es für Ihre Daten funktioniert, aber Sie können es gerne ändern und hier zurück posten.

#! /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;
    }
}