第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
本日はここまで。