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 usaCREATE 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 usa1
e0
(um regex simples para isso pode falhar quando você tem uma string como:'Eu faço, você não' dentro de seuINSERT INTO
) - SQLLite usa
AUTOINCREMENT
, o MySQL usaAUTO_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;
}
}