ActiveRecord是Ruby的對象-關係映射(ORM)框架,它幾乎老是被視爲Rails框架的一部分,但其自身也是一個實體,可經過gem單獨安裝和使用。本文以訪問Sqlite3爲例,介紹如何在Rails框架以外使用ActiveRecord訪問數據庫。sql
首先經過gem安裝ActiveRecord,運行如下命令:shell
gem install activerecord
#2. 安裝Sqlite3數據庫
爲了方便起見,本文演示訪問Sqlite3數據庫,訪問其餘數據庫(例如MySQL、PostgreSQL等)方法相似。ruby
gem install sqlite3
require 'active_record' ActiveRecord::Base.establish_connection(:adapter => "sqlite3", :database => ":memory:")
「:adapter」適配器一項選擇相應的數據庫適配器,此處是sqlite3; 「:database」爲目標數據庫,sqlite是文件型數據庫,所以這一項是目標文件的路徑,例如「info.db」。「:memory:」是一個特殊的文件,使用內存而不是外部文件。網絡
ActiveRecord::Schema.define do drop_table :hosts if table_exists? :hosts create_table :hosts do |table| table.column :name, :string end drop_table :disks if table_exists? :disks create_table :disks do |table| table.column :host_id, :integer table.column :dev_name, :string table.column :mnt_point, :string table.column :mb_available, :integer end drop_table :reports if table_exists? :reports create_table :reports do |table| table.column :disk_id, :integer table.column :created_at, :datetime table.column :mb_used, :integer end end
上述代碼總共建立了 :hosts、:disks和:reports三張表。框架
網絡上找到的絕大多數示例都沒有drop_table這句話,我我的認爲練習的時候會頻繁地測試,加上自動刪除纔是完整的步驟。測試
此處的功能應該就是對應Rails裏migration過程。ui
這一步進入正題,定義在代碼中使用的對象,即數據模型url
class Host < ActiveRecord::Base has_many :disks end class Disk < ActiveRecord::Base belongs_to :host has_many :reports end class Report < ActiveRecord::Base belongs_to :disk end
對象與以前定義的表一一對應,其中用belongs_to和has_many等宏聲明瞭對象/表之間的聯繫。根據DRY原則,此處無需再定義表的字段!spa
這一步就是在Rails中定義model的過程。
host = Host.create(:name => "slarti") disk = host.disks.create(:dev_name => "/dev/disk1s1", :mnt_point => "/", :mb_available => 80 * 1024) disk.reports.create(:mb_used => 20 * 1024) disk.reports.create(:mb_used => 25 * 1024)
經過操做上一步定義的數據模型便可實現插入數據。
Host.all.each do |host| puts "*** #{host.name} ***" host.disks.each do |disk| printf "%s(%s) %d/%d\n", disk.mnt_point, disk.dev_name, disk.reports.last.m\ b_used, disk.mb_available end end
使用數據模型檢索數據,就像操做Ruby內建的Hash同樣方便。
經過上面幾個簡單的步驟,就能實現Ruby在Rails框架以外經過ActiveRecord訪問Sqlite3數據庫,經過相似的步驟也能很輕鬆訪問其餘類型的數據庫。
最後,在給出一個訪問IBM DB2數據庫的例子。特別照顧「DB2」的緣由是:
DB2有JDBC驅動,爲實現Ruby訪問DB2,最簡單的方法莫過於用JRuby(Ruby的Java平臺實現版本)經過JDBC訪問數據庫;但JDBC的方式太原始了,遠不及ActiveRecord方便。幸虧ActiveRecord提供了 jdbc 轉 ActiveRecord 的適配器。
注 如下操做須要使用JRuby
首先從IBM官網下載最新的DB2-JDBC驅動,並把jar包加到classpath。
gem install activerecord-jdbc-adapter
require 'active_record' ActiveRecord::Base.establish_connection(:adapter => "jdbc", :driver => "com.ibm.db2.jcc.DB2Driver", :url => "jdbc:db2://host:port/DBNAME", :username => "username", :password => "password")
和訪問Sqlite3的區別僅僅是適配器改爲jdbc、提供相應的驅動類、以及鏈接url等基本信息。