at posts/single.html

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

もう一度同じスクリプトを動かすと、あれだけ頻発していたエラーがすっかり出なくなった。 最初にちゃんとマニュアルを読まないとな…。

関連する日記