脫離Rails使用ActiveRecord

ActiveRecord是Ruby的對象-關係映射(ORM)框架,它幾乎老是被視爲Rails框架的一部分,但其自身也是一個實體,可經過gem單獨安裝和使用。本文以訪問Sqlite3爲例,介紹如何在Rails框架以外使用ActiveRecord訪問數據庫。sql

1. 安裝ActiveRecord

首先經過gem安裝ActiveRecord,運行如下命令:shell

gem install activerecord

#2. 安裝Sqlite3數據庫

爲了方便起見,本文演示訪問Sqlite3數據庫,訪問其餘數據庫(例如MySQL、PostgreSQL等)方法相似。ruby

gem install sqlite3

3. 鏈接數據庫

require 'active_record'

ActiveRecord::Base.establish_connection(:adapter => "sqlite3", :database  => ":memory:")

「:adapter」適配器一項選擇相應的數據庫適配器,此處是sqlite3; 「:database」爲目標數據庫,sqlite是文件型數據庫,所以這一項是目標文件的路徑,例如「info.db」。「:memory:」是一個特殊的文件,使用內存而不是外部文件。網絡

4. 建表

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

5. 定義模型

這一步進入正題,定義在代碼中使用的對象,即數據模型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的過程。

6. 生成數據

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)

經過操做上一步定義的數據模型便可實現插入數據。

7. 檢索

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數據庫,經過相似的步驟也能很輕鬆訪問其餘類型的數據庫。

經過JDBC訪問DB2

最後,在給出一個訪問IBM DB2數據庫的例子。特別照顧「DB2」的緣由是:

  1. 在網上看到一篇文章:http://zfree.iteye.com/blog/297877,提到ActiveRecord支持除DB2以外的全部主流數據庫,雖然文章是在08年發表的,不過在gem裏倒的確沒看到有DB2的適配器;
  2. 我如今負責的項目數據庫就是採用DB2,研究DB2的訪問方式對個人工做有直接幫助。

DB2有JDBC驅動,爲實現Ruby訪問DB2,最簡單的方法莫過於用JRuby(Ruby的Java平臺實現版本)經過JDBC訪問數據庫;但JDBC的方式太原始了,遠不及ActiveRecord方便。幸虧ActiveRecord提供了 jdbc 轉 ActiveRecord 的適配器。

如下操做須要使用JRuby

下載DB2 JDBC驅動

首先從IBM官網下載最新的DB2-JDBC驅動,並把jar包加到classpath。

安裝jdbc適配器

gem install activerecord-jdbc-adapter

鏈接DB2

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等基本信息。

相關文章
相關標籤/搜索