誰もがいくつかのgrepsとperl式から始めているようで、特定のデータセットで機能するものを取得しますが、データが正しくインポートされているかどうかはわかりません。誰も2つの間で変換できる堅実なライブラリを構築していないことに真剣に驚いています。
ここに、2つのファイル形式の間で私が知っているSQL構文のすべての違いのリストがあります:で始まる行:
- トランザクションの開始
- コミット
- sqlite_sequence
- 一意のインデックスを作成する
MySQLでは使用されません
- SQLiteは
CREATETABLE / INSERT INTO "table_name"
を使用します MySQLはCREATETABLE / INSERT INTO table_name
を使用します - MySQLはスキーマ定義内で引用符を使用しません
- MySQLは、
INSERT INTO
内の文字列に一重引用符を使用します 条項 - SQLiteとMySQLには、
INSERT INTO
内の文字列をエスケープする方法が異なります。 条項 - SQLiteは
't'
を使用します および'f'
ブール値の場合、MySQLは1
を使用します および0
(このための単純な正規表現は、次のような文字列がある場合に失敗する可能性があります。 ) - SQLLiteは
AUTOINCREMENT
を使用します 、MySQLはAUTO_INCREMENT
を使用します
これは、 myで機能する非常に基本的なハッキングされたperlスクリプトです。 データセットを作成し、Webで見つけた他のperlスクリプトよりも多くのこれらの条件をチェックします。 Nuは、データに対して機能することを保証しますが、自由に変更してここに投稿してください。
#! /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;
}
}