« 02.04 日本語入力 on xrdp 0.5.0 | ココ | 02.06 涼宮ハルヒの消失 »

2010年2月 5日

SQLite3 to MySQL with SQLAlchemy(0.4)  このエントリーを含むはてなブックマーク 

Pylonsで作ったRSSリーダーがいよいよ反応悪くなって、DBアクセス関連のエラー(DB Locked)が多発してしまうようになった。どうやらSQLite3だとデータが増えるとレスポンスが悪くなるようなので、便のいいMySQLにデータを移そうと思い立った。

まずは、sqlite3コマンド .output と .dump でダンプファイルを作成。
次に、↓のようなスクリプトを作って、SQLをMySQLで読み込めるように変換する & DBとテーブルの作成を実行(Pylonsのコマンドで)。

#!/usr/bin/perl

while (<>) {
  s/^BEGIN TRANSACTION/BEGIN/;
  s/^INSERT INTO "(feeditems|rssuris|tags|rssuri_tags)"/INSERT INTO `$1`/;
  s/\\/\\\\/g;
  s/''([^'])/\\'$1/g;
  s/\\',/'',/g;
  s/\\'\);/'');/g;
  print;
}

`echo 'DROP DATABASE db; CREATE DATABASE db;' | mysql -u user -p db`;
`paster setup-app development.ini`;

$ perl -lne 'print unless(/^CREATE TABLE/ .. /^\);/ || /^CREATE INDEX/);' sqlite3.sql | perl upperscript.pl > converted.sql

これでCREATE TABLE / CREATE INDEXの部分を除いた形でダンプファイルをMySQL方式に変換(とりあえず、クウォート処理の部分だけエスケープの形式を変えただけで済んだけど、他の文字も変えなあかん時はその分変換処理が増える)。

このときの、development.iniのデータベースの指定部分はMySQL仕様にしておかないと、意味がない。

sqlalchemy.url = mysql://user:pass@localhost/db
sqlalchemy.echo = True
sqlalchemy.pool_recycle = 3600
sqlalchemy.pool_size = 10
sqlalchemy.strategy = threadlocal
sqlalchemy.encoding = utf8
sqlalchemy.convert_unicode = True

SQLAlchemyの設定で、「convert_unicode = True」がないと日本語が絡むSQLでエラー(Latin-1のエンコードエラー)が出る。これにハマった。

By ただ at 23:33 カテゴリー ; プログラミングとか

« 02.04 日本語入力 on xrdp 0.5.0 | 02月の記事 | 02.06 涼宮ハルヒの消失 »




トラックバック

このエントリーのトラックバックURL:
http://pinmarch.sakura.ne.jp/mt/mt-tb.cgi/1537