MySQLからSQLiteへデータ移行について


・WordpressのデータをMYSQLからSQLite3に
・phpAdminのエクスポートで出力
・phpLiteAdminでsqlite3にインポート
・sqlite3にテーブルだけは事前に作成しておく

こんな感じで行いました。
実際には、phpAdminのエクスポートしたデータをそのまま取り込むのは無理でした

MySQLとSQLiteの差異

■データ変換系
(CakePHP,PHP,SQLite3,MySQL) SQLで"%"や"_"をエスケープしたい - すたら日記
(正規表現, PHP, JavaScript) MySQLの改行文字(\n)を、SQLite用に置換したい - すたら日記
MySQLからSQLiteへデーターを移す

MySQL to SQLite Migration
sqlite - Quick easy way to migrate SQLite3 to MySQL? - Stack Overflow

■複数行のINSERTは使えます情報
SQLiteで複数の行を1行のINSERT文でまとめて追加する – 山本隆の開発日誌

解説
#!/usr/bin/perl
while (<>){
    s/\\'/''/g;                # Use '' instead of \'
    s/\"/"/g;                 # Use " instead of "
    s/\\r\\n/\r\n/g;           # Convert escaped \r\n to literal
    s/\\\\/\\/g;               # Convert escaped \ to literal
    s/ auto_increment//g;      # Remove auto_increment
    s/^[UN]*?LOCK TABLES.*//g; # Remove locking statements
    print;
}

mysqldump --complete-insert=TRUE --extended-insert=FALSE \
--protocol=TCP -t -h [HOSTNAME] -P [PORT] \
-u [USERNAME] -p [DATABASE] > dump.sql



cat dump.sql | perl mysql2sqlite.pl | sqlite3 database.sqlite3
MySQL to SQLite Migration


後から気づいたのですが、perl事例ですけど、これが正解で、一番わかりやすい解説だった気がします。

実際の変換コード

phpAdminのエクスポートは、
・テーブル単位
・定義分は含まない
・複数行のINSERTは使わない
で出力しました。

mysqldump -c -t --lock-tables=false --skip-extended-insert


mysqldumpでいえば、上記のような感じのオプション

INSER文の中身をsqlite3に合うように変換
$data =str_replace(array('"'), '"', $data);
$data =str_replace(array("\\'"), "''", $data);
$data =str_replace(array("\\\"), "\", $data);
$data =str_replace(array("\\r\\n", "\\r", "\\n"), "\r\n", $data);

・「\"」->「"」
・「\'」->「''」
・「\\」->「\」
・「\r\n」「\r」「\n」->改行コード

必要ないコメント行などを削除
$data = preg_replace("/UNLOCK TABLES;/", "", $data);
$data = preg_replace("/LOCK TABLES `.*` WRITE;/", "", $data);

$data = preg_replace("/^--(.*|\n)/", '', $data);
$data = preg_replace("/\n--( |\n).*/", '', $data);

$data = preg_replace("/\n\/\*!.*\/;/", '', $data);
$data = preg_replace("/\nSET.*/", '', $data);

手作業で消すのは面倒だったので、同時にPHPで削除してみた。
ただし、「UNLOCK TABLES;」とかいうINSERTデータがあるとかは想定してないサンプルコードなので注意!!


関連のある記事

スポンサーリンク

コメントを残す

メールアドレスは公開されません。
また、コメント欄には、必ず日本語を含めてください(スパム対策)。