Iedereen lijkt te beginnen met een paar grep- en perl-expressies en je krijgt min of meer iets dat werkt voor jouw specifieke dataset, maar je hebt geen idee of het de gegevens correct heeft geïmporteerd of niet. Het verbaast me serieus dat niemand een solide bibliotheek heeft gebouwd die tussen de twee kan converteren.
Hier een lijst met ALLE verschillen in SQL-syntaxis die ik ken tussen de twee bestandsindelingen:De regels die beginnen met:
- BEGIN TRANSACTIE
- COMMIT
- sqlite_sequence
- EEN UNIEKE INDEX MAKEN
worden niet gebruikt in MySQL
- SQLite gebruikt
CREATE TABLE/INSERT INTO "table_name"
en MySQL gebruiktCREATE TABLE/INSERT INTO table_name
- MySQL gebruikt geen aanhalingstekens binnen de schemadefinitie
- MySQL gebruikt enkele aanhalingstekens voor strings binnen de
INSERT INTO
clausules - SQLite en MySQL hebben verschillende manieren om te ontsnappen aan strings binnen
INSERT INTO
clausules - SQLite gebruikt
't'
en'f'
voor booleans gebruikt MySQL1
en0
(een eenvoudige regex hiervoor kan mislukken als je een string hebt zoals:'I do, you don't' in jeINSERT INTO
) - SQLLite gebruikt
AUTOINCREMENT
, MySQL gebruiktAUTO_INCREMENT
Hier is een heel eenvoudig gehackt perl-script dat werkt voor mijn dataset en controleert op veel meer van deze voorwaarden dan andere perl-scripts die ik op internet vond. Nu garandeert dat het voor je gegevens werkt, maar voel je vrij om het aan te passen en hier terug te posten.
#! /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;
}
}