« 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