Rails + sqlite3 の落とし穴
vmware 上の Debian sarge で、 Rails と SQLite3 を使ってアプリを作っていたんだけど、大量のデータを INSERT するとエラーが頻発する状況になった。 エラーの発生箇所も、エラーの内容も実行する度にまちまち(No method error とか SEGV とか)で、さっぱり原因が分からない。
丸一日悩んだところで、ようやく原因が見つかった。 Linux (含UNIX) で SQLite3 を使う場合は、 SWIG というものを事前にインストールしなければいけなかったらしい。
UNIXとMac OS Xでは、sqlite-ruby gem や sqlite3-ruby gemを インストールする前にswigがインストールされてないといけない。そうしないと、gemは本当のsqliteライブラリを利用できない上、デフォルトで代わりにインストールされるピュアrubyのsqliteライブラリは正しく動かない。
全く動かなくなる訳じゃないので、すっかりハマってしまった。 前に Rails を使ったときは、症状が起きなかったから全然疑わなかったもんなぁ。 ということで、下記のように対処。
$ sudo aptitude install swig $ sudo gem install sqlite3-ruby Attempting local installation of 'sqlite3-ruby' Local gem file not found: sqlite3-ruby*.gem Attempting remote installation of 'sqlite3-ruby' Updating Gem source index for: http://gems.rubyforge.org Select which gem to install for your platform (i386-linux) 1. sqlite3-ruby 1.2.0 (mswin32) 2. sqlite3-ruby 1.2.0 (ruby) > 2
もう一度同じスクリプトを動かすと、あれだけ頻発していたエラーがすっかり出なくなった。 最初にちゃんとマニュアルを読まないとな…。