icon Ruby on Rails 2.0 日记

第3章 SQLite3

上一章中,生成了新程序。虽然还不具备任何功能,但是还是先试着运行一下服务器吧。


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 开始。

从 www.sqlite.org 上下载SQLite3的 DLL 。是个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 三个包。

> 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

今天就到这里。

(2007/12/21)