`
网络接口
  • 浏览: 44866 次
文章分类
社区版块
存档分类
最新评论

Ruby操作数据库方法

阅读更多
各种形式的数据是当前信息社会的基石;而数据库则是保存、管理数据的最佳工具。一个现代编程语言,如果缺少操作数据库的支持,那么它的用途就会大打折扣。值得庆幸的是,我喜爱的Ruby语言,对数据库的支持是很完善的。今天,我就想和大家分享一下Ruby操作数据库的各种不同的方法。

通过编写对应数据库的驱动插件,目前Ruby支持大部分主流的关系型数据库系统,从开源的MySQL/Postgresql,到商业的DB2/Oracle,都有Ruby爱好者编写的对应驱动,并且在不断更新。所以,如果您想把Ruby用在以数据库为中心的信息系统中时,不需要有任何顾虑。

从底层的基本操作到高级的抽象操作这个顺序,目前Ruby访问数据库的方法可分为4层,如下图所示:

------------------------------------------------------
| 4 - ActiveRecord ORM
------------------------------------------------------
| 3 - DBI抽象层
------------------------------------------------------
| 2 - 对应数据库的Ruby驱动层(Ruby-Pr...)
------------------------------------------------------
| 1 - 数据库层(MySQL/Postgresql...)
------------------------------------------------------

最底层是数据库层,这层对应了各种不同的关系型数据库,比如MySQL/Oracle等。它上面的是驱动层,就是各数据库对应的Ruby驱动插件,这层的插件是数据库相关的,就是不同的数据库驱动插件也不同。然后在驱动层的基础上,我们就可以发展出DBI层(Database Interface)。在DBI这层,我们就可以编写独立于数据库的代码了。哈,这就是抽象的力量,也是我们软件开发者一直在追求的。不过当前的一个流行趋势是ORM,就是对象/关系型数据库表的映射,ActiveRecord就是一个 Ruby 的ORM组件,我们在下面可以看到它的一些应用。

现在,让我们一步步来体验一下Ruby操作数据库的快乐!我是在类Unix环境下(Linux/MacOSX都/BSD可以)操作的,数据库我选择了postgresql,因为我喜欢它的易用强大和宽松的BSD协议。您可以到 www.postgresql.com 下载最新的代码来编译、安装postgres数据库,这里不详细说明了。

假设我们把数据库安装在/usr/local/pgsql里面,用户名/密码为postgres/postgres。第一步,我们要安装postgres对应的Ruby驱动程序,您可以到 http://ruby.scripting.ca/postgres 下载该驱动。我下载的是文件ruby-postgres-0.7.1.tar.gz(2003/01/06),然后1、解压缩:tar zxvf ruby-postgres-0.7.1.tar.gz
2、配置:
  cd ruby-postgres-0.7.1
  ruby extconf.rb --with-pgsql-include-dir=/usr/local/pgsql/include \
                  --with-pgsql-lib-dir=/usr/local/pgsql/lib
注意:后面--with-pgsql-include-dir和--with-pgsql-lib-dir要根据您的postgres安装路径灵活修改。

3、编译:make
4、安装:sudo make install

安装上postgres的Ruby驱动之后,我们就可以用它来完成一些基本的对Postgresql数据库操作了。启动数据库postgres,建立一个测试数据库:createdb -E UNICODE testdb
然后我们往testdb数据库插入一个新表mytab,为简单起见,就2个字段:

[Copy to clipboard]
CODE:
create table mytab(
id       serial    not null,
msg      varchar(100),
primary key(id)
);

好了,准备好这些之后,就可以使用驱动来连接、操作了。在上面提到的下载驱动的站点,有一份简单的文稿,描述了该驱动支持的各种方法、函数。现在就让我们来完成一个简单的任务,就是往表mytab中插入一条数据,然后显示整个表的内容。这时直接使用postgres数据库驱动写的代码:

[Copy to clipboard]
CODE:
require 'postgres'

# 对应参数:主机名,端口号,连接参数,指定pgtty,数据库,用户名,密码
conn = PGconn.connect('localhost', 5432, '', '', 'testdb', 'postgres', 'postgres')
#  exec方法直接执行SQL语句,返回一个PGresult对象
conn.exec("insert into mytab(msg) values('I was inserted by driver.')")

# 取得表格数据,并分行打印
res = conn.exec('select * from mytab').result
for data in res
  p data
end

conn.close  # 关闭数据库连接

上面代码运行结果:

[Copy to clipboard]
CODE:
inity:~/tmp jellen$ ruby qd.rb
["1", "I was inserted by driver."]

直接面向数据库驱动的代码,虽然能完成工作,但是可移植性差,并且代码比较底层,不容易维护。要是换一个数据库,就需要重新编写大部分代码,这样不利于系统维护。于是人们便在数据库驱动的上面,抽象出DBI这样一个应用。就是只要变换几条数据库连接命令,就可以用相同的代码来操作各种不同的数据库,而且编程借口进一步统一、完善。这样,就大大减少了程序员为多个不同数据库编程的工作量,大大扩展了应用程序的可移植性。

要使用Ruby DBI,我们必须下载安装它,这个是Ruby DBI的官方站点:
http://rubyforge.org/projects/ruby-dbi
您可以在上面下载到ruby-dbi的最新代码,我下的是dbi-0.1.1.tar.gz
接下来解压缩:tar zxvf dbi-0.1.1.tar.gz
转到目录:cd ruby-dbi
然后配置:
  ruby setup.rb config --with=dbi,dbd_pg
注:这个--with参数根据您的数据库类型选择(可以多个),这里仅选postgresql。
  ruby setup.rb setup
最后安装:sudo ruby setup.rb install

装上ruby-dbi之后,我们就可以使用它来操作数据库了。搜索网络,我们能找到一些ruby-dbi的资料,足够我们能够开始使用ruby-dbi来干活。下面的代码就是完成了和上面一样的任务,就往表格插一条数据,然后显示整个表格的内容:

[Copy to clipboard]
CODE:
require 'dbi'

# 根据不同的数据库,填不同的连接字符串,然后跟用户名、密码
dbh = DBI.connect('DBI:Pg:testdb', 'postgres', 'postgres')

# 可以使用sql替换,避免注入式攻击。
sql = 'insert into mytab(msg) values(?)'
dbh.do(sql, 'I was inserted by ruby-dbi.')

# dbi有完善的事务支持
sth = dbh.prepare('select * from mytab')
sth.execute
while row = sth.fetch
  p row
end
sth.finish

dbh.disconnect # 关闭数据库连接

从上面的代码可以看出,dbi层对数据库的操作更加抽象、高级,对各种工程中用到的技术支持也更完善。可以说,ruby-dbi是ruby直接操作数据库最好的方式,很适合在实际工程中使用。

最后我们要看的是ActiveRecord组件操作数据库的方法。ActiveRecord是著名的Ruby MVC框架Rails的一个组件,用来实现对象/关系型数据的映射,它在更高抽象层次上实现了操作数据库的各种方法,是一个简单好用的项目开发组件。由于Ruby拥有gems这个优秀的插件体系,我们可以单独使用ActiveRecord来操作数据库。由于ActiveRecord是 rails 的一个组件,所以如果您机器上已经安装了rails,那么ActiveRecord就不用另外安装了。不过单独安装它也很容易,只要在终端运行:
gem install activerecord
就可以了(前提是您已经安装了RubyGems)。

在ActiveRecord中,数据库的一个表格代表程序中的一个类对象,表格中的每个字段分别对应了类中的一个属性。对数据库的操作转化到程序中程序员熟悉的代码模式;我们可以不用涉及具体的SQL语句,就可以对数据库进行增、删、改等操作了。这样一来,我们可以在更高的抽象层次上来进行业务操作,完全屏蔽了丑陋的SQL语句,抽象万岁!

ActiveRecord有一个自成体系的操作模式,比如数据表格和类的命名、对应方式,是复数的表名对应单数的类名,如果一个表格名字为students,那么和它对应的类名就是Student。这些规定对刚接触Rails的人可以感觉不习惯,但是习惯之后就会发觉其实也是很方便的,至少我们不用为代码中各种变量、类的命名伤脑筋了。然后ActiveRecord有很多内建的方法,具体请参考相关书籍。现在,让我们来用ActiveRecord来完成我们上面规定的任务,不多解释,请看代码:

[Copy to clipboard]
CODE:
require 'rubygems'
require_gem 'activerecord'  # 请注意使用rubygems时候的声明方式

# 连接数据库,按需求填写各种参数。
ActiveRecord::Base.establish_connection(:adapter => "postgresql",
  :host => "localhost", :database => "testdb")
class Mytab < ActiveRecord::Base # 开始ORM对应
  set_table_name 'mytab' # 指定数据库名
end

# 插入一条数据
tab = Mytab.new
tab.msg = 'I was inserted by ActiveRecord.'
tab.save

# 显示所有数据
data = Mytab.find(:all)
data.each { |line| puts "['#{line[:id]}', '#{line[:msg]}']" }

感叹于程序员对抽象孜孜不倦的追求,查看上面的代码,我们没有看到任何具体的SQL语句,全部预定对数据库的操作,都在常规的类对象操作之间完成。为了验证我们的整个操作过程,我们可以到postgresql的交互命令行终端:psql -U postgres testdb

[Copy to clipboard]
CODE:
testdb=# select * from mytab;
id |               msg
----+---------------------------------
  1 | I was inserted by driver.
  2 | I was inserted by ruby-dbi.
  3 | I was inserted by ActiveRecord.
(3 rows

哈哈,所有数据都已经正确入库!到此为止,我们一起体验了Ruby语言操作数据的不同方法。没一种操作数据库的方法都有自己的优点和缺点,在实际工作中,大家应该按照具体情况选择适合自己的方法。本文只是起个抛砖引玉的作用,要详细了解每个方法具体的内容,请参考相关文档。
分享到:
评论

相关推荐

    Ruby 连接数据库资源汇总

    这个资源汇总涵盖了Ruby连接各种数据库的方法,无论是使用特定的数据库驱动还是通用的DBI库,都能帮助开发者轻松地处理数据库操作。对于初学者来说,理解这些概念和示例代码是学习Ruby数据库编程的关键步骤。在实际...

    ruby on rails 3.1.0数据库查询方法汇总

    ### Ruby on Rails 3.1.0 数据库查询方法汇总 #### 一、基础操作 在 Ruby on Rails 3.1.0 中,对于数据库的操作非常便捷,主要包括数据的保存、创建、查找等功能。 1. **保存数据**: - `a = Category.new(:name...

    Ruby-DataObjects企图重写现有的Ruby数据库驱动程序符合一个标准接口

    通过使用DataObjects,开发者可以专注于业务逻辑,而不必过于关心数据库操作的细节。这对于大型项目和需要跨数据库系统迁移的场景尤其有价值。此外,由于DataObjects遵循统一的接口,第三方库和框架也可以更容易地...

    巧用Ruby配备Oracle数据库

    总的来说,通过Ruby/OCI8库,开发者可以在Rails应用中顺利连接和操作Oracle数据库,但需要注意与Oracle特性的适配和性能调优。对于初次接触Oracle的Rails开发者来说,这可能需要一定的学习和实践,但一旦掌握了,就...

    ruby--dbi数据库操作gems相关

    DBI,全称“Database Independent Interface”,是Ruby中一个用于数据库操作的重要库。它提供了一个统一的接口,允许开发者通过简单的API与多种数据库系统进行交互,如MySQL、PostgreSQL、SQLite等,无需关心底层...

    ruby和drizzle数据库的连接

    在Ruby中,你可以使用`DBI`(Database Independent Interface)库来处理数据库操作,它提供了一个统一的接口来与多种数据库交互,包括Drizzle。以下是一个基本的示例,展示如何使用`DBI`和`drizzle-ruby`驱动建立...

    Ruby-ActiveRecordTurntable是一个数据库分片的ActiveRecord扩展

    通过将数据库表映射为Ruby类,开发者可以使用面向对象的方式来操作数据,降低了数据库操作的复杂性。ActiveRecord 提供了丰富的查询语言,使得CRUD(创建、读取、更新和删除)操作变得简单易行。 **二、数据库分片*...

    巧用ruby配备oracle数据库.pdf

    本文介绍了如何利用Ruby与Oracle数据库建立连接的方法。通过Ruby OCI8驱动程序,开发者能够在Ruby环境中无缝地操作Oracle数据库。无论是安装配置还是具体应用案例,都展示了Ruby与Oracle数据库之间高效协同工作的...

    ruby-oracle相关的数据库操作的gems包

    在Ruby编程语言中,Oracle数据库的操作通常依赖于特定的Gem包。标题提到的"ruby-oracle相关的数据库操作的gems包"是指一组用于连接和交互Oracle数据库的Ruby库。描述中指出,这些包主要基于oci8技术,oci8是Oracle...

    Ruby-SQLite3Ruby绑定SQLite3嵌入式数据库

    通过ActiveRecord,开发者可以使用Ruby对象来代表数据库中的记录,简化数据操作。 总之,Ruby-SQLite3是一个强大且实用的工具,它允许Ruby开发者在没有额外服务器进程的情况下轻松处理数据存储。无论是在学习基础的...

    Ruby on rails 数据库详细配置

    Rails的ActiveRecord库提供了方便的数据模型抽象,使得开发者可以使用Ruby代码轻松操作数据库表。 总的来说,配置Ruby on Rails的数据库涉及到安装必要的数据库驱动和Rails框架,然后在`database.yml`文件中正确...

    巧用Ruby配备Oracle数据库.doc

    在Ruby编程语言中,连接和操作Oracle数据库通常需要利用Ruby的数据库接口模块Ruby/DBI以及Oracle调用接口(OCI8)库。由于没有纯Ruby的Oracle瘦驱动,开发人员必须借助于OCI8这个C语言编写的Ruby包装器,它实现了与...

    PHP、Python、Ruby的(数据库、文件)比较(原创)

    它有一个强大的ORM框架ActiveRecord,这是Ruby on Rails框架的一部分,使得数据库操作非常直观。Ruby同样支持多种数据库,如MySQL、PostgreSQL等。在文件操作上,Ruby的File、Dir类提供了类似PHP的功能,但语法更为...

    Ruby-直系同源基因数据库

    在Ruby中,可以使用ActiveRecord这样的ORM(对象关系映射)库来简化与SQL数据库的交互,它将数据库操作转换为面向对象的API。 接着,开发者需要理解生物信息学的基本概念,如基因、蛋白质、同源性等,以便正确设计...

    Ruby-SequelRuby的数据库工具包

    **Ruby-Sequel:Ruby的全能数据库工具包** Ruby-Sequel是一个专门为Ruby编程语言设计的数据库访问库,它为开发者提供了一种...通过学习和掌握Sequel,开发者可以更好地管理和操作数据库,从而提高开发效率和代码质量。

    Ruby基础语法+Ruby变量与数据类型+Ruby控制结构+Ruby函数与方法+Ruby面向对象编程等全套教程

    Ruby函数与方法 Ruby面向对象编程 Ruby模块与包 Ruby错误处理 Ruby文件与I/O操作 Ruby正则表达式 Ruby网络编程 Ruby数据库交互 Ruby测试框架 RubyWeb框架Rails入门 Ruby高级特性 Ruby性能优化与最佳实践

    windows关于qt的数据库操作封装类以及用例,c++代码

    7. 比一些流行的数据库在大部分普通数据库操作要快 8. 简单, 轻松的API 9. 包含TCL绑定, 同时通过Wrapper支持其他语言的绑定 10. 良好注释的源代码, 并且有着90%以上的测试覆盖率 11. 独立: 没有额外依赖 12. ...

    Ruby-SecondBase为Rails提供双数据库无缝相集成

    "Ruby-SecondBase"就是为了解决这个问题而出现的一个库,它为Rails应用提供了无缝集成双数据库的能力。 SecondBase是专门为Rails设计的一个数据库扩展工具,它扩展了ActiveRecord的功能,使得在Rails应用中处理两个...

Global site tag (gtag.js) - Google Analytics