第3回 SQLite3

2007/12/21

前回、新規アプリケーションを作成しました。まだ、まったく機能はありませんが、とにかくサーバを起動してみましょう。

> script/server

無事、起動したようです。ブラウザで「http://localhost:3000/」を開くと、見慣れた「Welcome aboard」のページが表示されました。

異変が起きたのはは次の瞬間です。いつものように「About your application's environment」のリンクをクリックしました。すると、そこに現れたのは「MissingSourceFile in Rails/infoController#properties」という怪しげな文字列。よく見ると「no such file to load -- sqlite3」というエラーメッセージも!Rails 2.0 の洗礼です。正確に言うと、Rails 2.0.2 の洗礼。

Rails 2.0.2 からデフォルトのデータベースが、MySQL から SQLite3 に変わりました。理由は、MySQL よりも SQLite3 の方が手軽だから、だそうです。確かにその通りなのですが、SQLite3 がインストールされていない環境の人はびっくりしちゃいますよね。ちなみに、Mac OS X 10.5 Leopard の場合は SQLite3 がデフォルトで入っているそうで、そう聞くと ubuntu ユーザーとしては苦々しい思いを感じざるを得ません。

今まで通り、MySQL をデータベースとして選ぶのなら、新規アプリケーションを作るときに次のように書きます。

> rails -d mysql sample

しかし、後学のため、SQLite3 をインストールして使ってみましょうか。

まずは Windows から。

SQLite3 の DLL を www.sqlite.org からダウンロードします。ZIP 形式で圧縮されているので、PATH の通っているディレクトリ(C:\ruby\bin など)に展開します。Rails アプリを起動するだけなら、コマンドラインプログラム(sqlite3.exe)は不要です。

RubyGems で sqlite3-ruby をインストールします。

> gem install sqlite3-ruby

これで終わり。簡単ですね。

2008年8月27日に sqlite3-ruby のバージョン 1.2.4 がリリースされましたが、このバージョンについては Windows 用のバイナリが配布されていません。そのため、コンパイル環境が整っていないと「'nmake' は、内部コマンドまたは外部コマンド、操作可能なプログラムまたはバッチ ファイルとして認識されていません」というメッセージが出てインストールに失敗してしまいます。"gem install sqlite3-ruby --version=1.2.3" のようにバージョンを指定して、インストールしてください。

次に、Linux (Ubuntu) にインストールしてみます。

まず、パッケージ sqlite3 を apt-get でインストールします。

> sudo apt-get install sqlite3

これだけでは、もちろんダメです。先ほどのエラーメッセージから分かるように、sqlite3 に対応した Ruby のコードが必要です。Google で調べると、RubyGems で sqlite3-ruby を入れるようです。

> sudo gem install sqlite3-ruby

ああ、うまく行きません。インストールに失敗します。

Building native extensions.  This could take a while...
ERROR:  Error installing sqlite3-ruby:
        ERROR: Failed to build gem native extension.

/usr/bin/ruby1.8 extconf.rb install sqlite3-ruby
extconf.rb:1:in `require': no such file to load -- mkmf (LoadError)
        from extconf.rb:1

RubyGems のバージョンを上げたらうまくいったりして、と思い…(エラーメッセージからしてあり得ないのですが)、

> sudo gem update --system

お、バージョンが 1.0.1 になっている! でも、sqlite3-ruby のインストールが失敗するのは変わらないですね。

ここからいろいろとGoogleで検索したり、試行錯誤したりした結果、ruby1.8-dev、libsqlite3-dev、libsqlite3-ruby という3つのパッケージが欠けているためと判明。

> sudo apt-get install ruby1.8-dev
> sudo apt-get install libsqlite3-dev
> sudo apt-get install libsqlite3-ruby
> sudo gem install sqlite3-ruby

大成功!「Welcome aboard」ページの「About your application's environment」もちゃんと表示されました。

興味深いことに、「About your application's environment」のリンクをクリックした瞬間に、db ディレクトリに development.sqlite3 という空のファイルが生成されました。ちなみに、config/database.yml の記述(抜粋)はこんな風になっています:

development:
  adapter: sqlite3
  database: db/development.sqlite3
  timeout: 5000

本日はここまで。