Semua orang tampaknya memulai dengan beberapa ekspresi grep dan perl dan Anda agak mendapatkan sesuatu yang berfungsi untuk kumpulan data khusus Anda, tetapi Anda tidak tahu apakah itu mengimpor data dengan benar atau tidak. Saya sangat terkejut tidak ada yang membangun perpustakaan yang solid yang dapat mengkonversi di antara keduanya.
Berikut daftar SEMUA perbedaan sintaks SQL yang saya ketahui antara dua format file:Baris yang dimulai dengan:
- MULAI TRANSAKSI
- KOMITMEN
- sqlite_sequence
- BUAT INDEKS UNIK
tidak digunakan di MySQL
- SQLite menggunakan
CREATE TABLE/INSERT INTO "table_name"
dan MySQL menggunakanCREATE TABLE/INSERT INTO table_name
- MySQL tidak menggunakan tanda kutip di dalam definisi skema
- MySQL menggunakan tanda kutip tunggal untuk string di dalam
INSERT INTO
klausa - SQLite dan MySQL memiliki cara berbeda untuk melepaskan string di dalam
INSERT INTO
klausa - SQLite menggunakan
't'
dan'f'
untuk boolean, MySQL menggunakan1
dan0
(regex sederhana untuk ini bisa gagal ketika Anda memiliki string seperti:'I do, you don't' di dalamINSERT INTO
Anda ) - SQLLite menggunakan
AUTOINCREMENT
, MySQL menggunakanAUTO_INCREMENT
Berikut adalah skrip perl yang diretas yang sangat mendasar yang berfungsi untuk saya dataset dan memeriksa lebih banyak dari kondisi ini yang saya temukan di skrip perl lain di web. Nu menjamin bahwa ini akan berfungsi untuk data Anda, tetapi jangan ragu untuk memodifikasi dan memposting kembali di sini.
#! /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;
}
}