SQlite3のデータベースをMySQLへ移行しようと思ったが、単純にSQlite3のダンプファイルをMySQLにリストアするというのではダメらしい。そこで方法を探してみると、Quick easy way to migrate SQLite3 to MySQL?にSQlite3のダンプファイルをMySQL用に変換するPythonスクリプトがあった。
そのスクリプトでSQlite3のダンプファイルを変換する。まずは、スクリプトをsqlite_to_mysql.pyというファイルに保存し、以下のようなコマンドでSQlite3のダンプをスクリプトで変換する。変換した結果はdump.sqlというファイルに保存する。
続いてMySQLへのリストア。まずはMySQLにデータベースを作成。
そして変換したファイルをMySQLにリストアする。
しかし以下のようなエラーが発生してしまう。
スクリプトで変換したファイルを見てみると、CREATE TABLE直後のINSERT文の文字列がシングルクォーテーション(')でなくバッククォート(`)で囲まれている。これはスクリプトが掲載されている掲示板でも指摘されていて、その修正がされていないようだ。
スクリプトを調べてみると、正規表現でのマッチがうまく機能しておらず、searching_for_endがFalseになるはずのところでなっていない。CREATE TABLEの行を処理するときに前のDROP文と結合されlineが2行なるからだ。
そこで以下のように変更。
改めてSQlite3からダンプしてMySQLにリストアすると、エラーは発生しなかった。
そのスクリプトでSQlite3のダンプファイルを変換する。まずは、スクリプトをsqlite_to_mysql.pyというファイルに保存し、以下のようなコマンドでSQlite3のダンプをスクリプトで変換する。変換した結果はdump.sqlというファイルに保存する。
続いてMySQLへのリストア。まずはMySQLにデータベースを作成。
そして変換したファイルをMySQLにリストアする。
しかし以下のようなエラーが発生してしまう。
スクリプトで変換したファイルを見てみると、CREATE TABLE直後のINSERT文の文字列がシングルクォーテーション(')でなくバッククォート(`)で囲まれている。これはスクリプトが掲載されている掲示板でも指摘されていて、その修正がされていないようだ。
スクリプトを調べてみると、正規表現でのマッチがうまく機能しておらず、searching_for_endがFalseになるはずのところでなっていない。CREATE TABLEの行を処理するときに前のDROP文と結合されlineが2行なるからだ。
if searching_for_end and re.match(r'.*\);', line): searching_for_end = False
そこで以下のように変更。
if searching_for_end and re.match(r'.*\);', line, flags=(re.MULTILINE | re.DOTALL)): searching_for_end = False
改めてSQlite3からダンプしてMySQLにリストアすると、エラーは発生しなかった。
0 件のコメント:
コメントを投稿