sql >> Base de Datos >  >> RDS >> Mysql

¿Una forma fácil y rápida de migrar SQLite3 a MySQL?

Todo el mundo parece comenzar con algunas expresiones greps y perl y obtienes algo que funciona para tu conjunto de datos en particular, pero no tienes idea si los datos se importaron correctamente o no. Estoy seriamente sorprendido de que nadie haya creado una biblioteca sólida que pueda convertir entre los dos.

Aquí hay una lista de TODAS las diferencias en la sintaxis SQL que conozco entre los dos formatos de archivo:Las líneas que comienzan con:

  • COMENZAR TRANSACCIÓN
  • COMPROMISO
  • secuencia_sqlite
  • CREAR ÍNDICE ÚNICO

no se usan en MySQL

  • SQLite usa CREATE TABLE/INSERT INTO "table_name" y MySQL usa CREATE TABLE/INSERT INTO table_name
  • MySQL no usa comillas dentro de la definición del esquema
  • MySQL usa comillas simples para cadenas dentro de INSERT INTO cláusulas
  • SQLite y MySQL tienen diferentes formas de escapar cadenas dentro de INSERT INTO cláusulas
  • SQLite usa 't' y 'f' para booleanos, MySQL usa 1 y 0 (una expresión regular simple para esto puede fallar cuando tiene una cadena como:'Sí, tú no' dentro de tu INSERT INTO )
  • SQLLite usa AUTOINCREMENT , MySQL usa AUTO_INCREMENT

Aquí hay un script perl pirateado muy básico que funciona para my conjunto de datos y verifica muchas más de estas condiciones que otros scripts de perl que encontré en la web. Nu garantiza que funcionará con sus datos, pero no dude en modificarlo y publicarlo aquí.

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