ActiveRecord是Ruby的对象-关系映射(ORM)框架,它几乎总是被视为Rails框架的一部分,但其自身也是一个实体,可通过gem单独安装和使用。本文以访问Sqlite3为例,介绍如何在Rails框架之外使用ActiveRecord访问数据库。
1. 安装ActiveRecord
首先通过gem安装ActiveRecord,运行以下命令:
gem install activerecord
#2. 安装Sqlite3
为了方便起见,本文演示访问Sqlite3数据库,访问其他数据库(例如MySQL、PostgreSQL等)方法类似。
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过程。
5. 定义模型
这一步进入正题,定义在代码中使用的对象,即数据模型
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原则,此处无需再定义表的字段!
这一步就是在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”的原因是:
- 在网上看到一篇文章:http://zfree.iteye.com/blog/297877,提到ActiveRecord支持除DB2之外的所有主流数据库,虽然文章是在08年发表的,不过在gem里倒的确没看到有DB2的适配器;
- 我现在负责的项目数据库就是采用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等基本信息。
来源:oschina
链接:https://my.oschina.net/u/58387/blog/198731