Zdá se, že každý začíná s několika výrazy greps a perl a vy dostanete něco, co funguje pro vaši konkrétní datovou sadu, ale nemáte ponětí, zda jsou data importována správně nebo ne. Vážně mě překvapuje, že nikdo nevybudoval solidní knihovnu, která by mezi nimi mohla převádět.
Zde je seznam VŠECH rozdílů v syntaxi SQL, o kterých vím mezi těmito dvěma formáty souborů:Řádky začínající:
- ZAČNĚTE TRANSAKCI
- POTVRDIT
- sqlite_sequence
- VYTVOŘTE UNIKÁTNÍ INDEX
se nepoužívají v MySQL
- SQLite používá
CREATE TABLE/INSERT INTO "table_name"
a MySQL používáCREATE TABLE/INSERT INTO table_name
- MySQL nepoužívá v definici schématu uvozovky
- MySQL používá jednoduché uvozovky pro řetězce uvnitř
INSERT INTO
klauzule - SQLite a MySQL mají různé způsoby escapování řetězců uvnitř
INSERT INTO
klauzule - SQLite používá
't'
a'f'
pro booleany používá MySQL1
a0
(Jednoduchý regulární výraz pro to může selhat, když máte vINSERT INTO
řetězec jako:'Já ano, ty ne' ) - SQLLite používá
AUTOINCREMENT
, MySQL používáAUTO_INCREMENT
Zde je velmi základní hacknutý perl skript, který funguje pro my dataset a kontroluje mnohem více těchto podmínek, než jiné skripty v perlu, které jsem našel na webu. Nu zaručuje, že to bude fungovat pro vaše data, ale můžete je upravit a zveřejnit zde.
#! /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;
}
}