Mysql
 sql >> Base de données >  >> RDS >> Mysql

Un moyen simple et rapide de migrer SQLite3 vers MySQL ?

Tout le monde semble commencer avec quelques expressions greps et perl et vous obtenez en quelque sorte quelque chose qui fonctionne pour votre ensemble de données particulier, mais vous ne savez pas s'il a importé les données correctement ou non. Je suis sérieusement surpris que personne n'ait construit une bibliothèque solide capable de convertir entre les deux.

Voici une liste de TOUTES les différences de syntaxe SQL que je connais entre les deux formats de fichier :Les lignes commençant par :

  • COMMENCER LA TRANSACTION
  • COMMITTER
  • sqlite_séquence
  • CRÉER UN INDEX UNIQUE

ne sont pas utilisés dans MySQL

  • SQLite utilise CREATE TABLE/INSERT INTO "table_name" et MySQL utilise CREATE TABLE/INSERT INTO table_name
  • MySQL n'utilise pas de guillemets dans la définition du schéma
  • MySQL utilise des guillemets simples pour les chaînes à l'intérieur de INSERT INTO clauses
  • SQLite et MySQL ont différentes manières d'échapper les chaînes à l'intérieur de INSERT INTO clauses
  • SQLite utilise 't' et 'f' pour les booléens, MySQL utilise 1 et 0 (une simple regex pour cela peut échouer lorsque vous avez une chaîne comme :'Je fais, tu ne fais pas' à l'intérieur de votre INSERT INTO )
  • SQLLite utilise AUTOINCREMENT , MySQL utilise AUTO_INCREMENT

Voici un script perl piraté très basique qui fonctionne pour mon dataset et vérifie beaucoup plus de ces conditions que d'autres scripts perl que j'ai trouvés sur le Web. Nu garantit que cela fonctionnera pour vos données, mais n'hésitez pas à modifier et à publier ici.

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