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データがあるとかは想定してないサンプルコードなので注意!!


まとめ 1

<?php
//-------------------
// ファイル読み込み
//-------------------
$filename = "wp_users.sql";
$content = file_get_contents($filename);
$data = $content ;

//-------------------
// データ変換
//-------------------
$data =str_replace(array('"'), '"', $data);

//省略

//-------------------
// ファイル出力
//-------------------
$content = $data;
$output_filename = "wp_users.sql3";
file_put_contents($output_filename,$content);

データ変換部の前後に、sqlファイルの読み込み、変換したsqlファイルの書き出し部分を付ければツールとして使えると思います。

まとめ 2

<?php
if( !empty($_FILES['file1']['tmp_name']) && is_uploaded_file($_FILES['file1']['tmp_name']) ) {

$filename  = $_FILES['file1']['tmp_name'];
$dl_filename = $_FILES['file1']['name']."3";

//--------------
//$filename = "wp_users.sql";
$content = file_get_contents($filename);

$data = $content ;

//-------------------
// データ変換
//-------------------
$data =str_replace(array('"'), '"', $data);

//省略

$content = $data;
//echo $content ;
//---------------------------
header('Content-Type: text/plain');
header('Content-Disposition: attachment; filename='.$dl_filename);
   echo $content;
   exit;


}else{
?>
<form method="post" action="s001.php" enctype="multipart/form-data">
	<input type="file" name="file1">
	<input type="submit" value="送信">
</form>
<?php } ?>

ブラウザのアップロード機能、ダウンロード機能を利用して、ファイルの読み込み、ファイルの出力(ダウンロード)をするようにしたバージョン。

スポンサーリンク