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

相关文章
相关标签/搜索