脱离Rails使用ActiveRecord

坚强是说给别人听的谎言 提交于 2020-02-29 21:59:34

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”的原因是:

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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!