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