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 utiliseCREATE 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 utilise1
et0
(une simple regex pour cela peut échouer lorsque vous avez une chaîne comme :'Je fais, tu ne fais pas' à l'intérieur de votreINSERT INTO
) - SQLLite utilise
AUTOINCREMENT
, MySQL utiliseAUTO_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;
}
}