Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Maneira rápida e fácil de migrar SQLite3 para MySQL?


Todo mundo parece começar com algumas expressões greps e perl e você meio que obtém algo que funciona para o seu conjunto de dados específico, mas você não tem ideia se os dados foram importados corretamente ou não. Estou seriamente surpreso que ninguém tenha construído uma biblioteca sólida que possa converter entre os dois.

Aqui está uma lista de TODAS as diferenças na sintaxe SQL que conheço entre os dois formatos de arquivo:As linhas que começam com:
  • INICIAR TRANSAÇÃO
  • COMPROMISSO
  • sqlite_sequence
  • CRIAR ÍNDICE ÚNICO

não são usados ​​no MySQL
  • SQLite usa CREATE TABLE/INSERT INTO "table_name" e o MySQL usa CREATE TABLE/INSERT INTO table_name
  • O MySQL não usa aspas dentro da definição do esquema
  • O MySQL usa aspas simples para strings dentro do INSERT INTO cláusulas
  • SQLite e MySQL têm maneiras diferentes de escapar de strings dentro de INSERT INTO cláusulas
  • SQLite usa 't' e 'f' para booleanos, o MySQL usa 1 e 0 (um regex simples para isso pode falhar quando você tem uma string como:'Eu faço, você não' dentro de seu INSERT INTO )
  • SQLLite usa AUTOINCREMENT , o MySQL usa AUTO_INCREMENT

Aqui está um script perl hackeado muito básico que funciona para my dataset e verifica muito mais dessas condições que outros scripts perl que encontrei na web. Nu garante que funcionará para seus dados, mas sinta-se à vontade para modificar e postar novamente aqui.
#! /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;
    }
}