Wydaje się, że każdy zaczyna od kilku wyrażeń greps i perl, a ty dostajesz coś, co działa dla twojego konkretnego zestawu danych, ale nie masz pojęcia, czy dane zostały zaimportowane poprawnie, czy nie. Jestem poważnie zaskoczony, że nikt nie zbudował solidnej biblioteki, która może konwertować między nimi.
Oto lista WSZYSTKICH różnic w składni SQL, które znam między dwoma formatami plików:Wiersze zaczynające się od:
- ROZPOCZNIJ TRANSAKCJĘ
- POTWIERDZENIE
- sqlite_sequence
- UTWÓRZ UNIKALNY INDEKS
nie są używane w MySQL
- SQLite używa
CREATE TABLE/INSERT INTO "table_name"
a MySQL używaCREATE TABLE/INSERT INTO table_name
- MySQL nie używa cudzysłowów w definicji schematu
- MySQL używa pojedynczych cudzysłowów dla ciągów znaków wewnątrz
INSERT INTO
klauzule - SQLite i MySQL mają różne sposoby ucieczki ciągów wewnątrz
INSERT INTO
klauzule - SQLite używa
't'
i'f'
dla wartości logicznych MySQL używa1
i0
(proste wyrażenie regularne dla tego może się nie powieść, gdy masz ciąg taki jak:„Tak, nie” wewnątrz TwojegoINSERT INTO
) - SQLLite używa
AUTOINCREMENT
, MySQL używaAUTO_INCREMENT
Oto bardzo prosty, zhakowany skrypt perla, który działa dla mój dataset i sprawdza o wiele więcej tych warunków niż inne skrypty perla, które znalazłem w sieci. Nu gwarantuje, że będzie działać z Twoimi danymi, ale możesz je modyfikować i przesyłać z powrotem tutaj.
#! /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;
}
}