zuerrong 发表于 2011-08-17 11:16

ruby扫盲之数据库篇

Ruby使用统一数据库接口模块DBI来访问数据库,在DBI下面是各类数据库的驱动,如DBD::MySQL、DBD::SQLite。这个概念是跟Perl学的,Ruby DBI实际是ports了Perl的DBI模块。

(一)安装DBI和DBD::MySQL

我的是ubuntu 9.10自带的ruby 1.8.7和gems。由于apt-get安装的gems不能执行gems update自动升级,因此到rubygems.org上下载一个最新的gems,并安装它。

安装完后,运行如下命令安装MySQL相关驱动:

apt-get install ruby1.8-dev
gem install dbi
gem install dbd-mysql

说明:如果系统里没有安装Mysql,那么在上述步骤之前,先执行:

apt-get install mysql-client
apt-get install libmysqlclient-dev


(二)使用DBI

如果你熟悉Perl DBI的话,那么Ruby DBI使用简直一样。代码如下:

require 'rubygems'
require 'dbi'

# 创建dbh连接对象
dbh = DBI.connect('DBI:Mysql:test','root','')

# prepare一个SQL,创建sth对象
sth = dbh.prepare("insert into t1 (name,gender,city,mobile) values (?,?,?,?)")

# 执行SQL,插入一行数据
sth.execute('John Doe','M','Archer','4076320942')
sth.finish

# 执行SQL查询,并且逐行打印结果
sth = dbh.prepare("select * from t1")
sth.execute
while row = sth.fetch do
p row
end
sth.finish

# 断开数据库
dbh.disconnect

但是,我个人更喜欢rubyish风格的代码,上述可重写如下:

require 'rubygems'
require 'dbi'

# connect方法同样创建dbh连接对象,但它接受一个block参数,并在方法里将dbh对象传给block
DBI.connect('DBI:Mysql:test','root','') do |dbh|

    # 一个插入SQL语句
    sql = "insert into t1 (name,gender,city,mobile) values (?,?,?,?)"

    # prepare这个SQL,prepare同样接受block参数,并将sth对象传入block
    dbh.prepare(sql) do |sth|
      # 执行SQL插入
      sth.execute('John Doe','M','Archer','4076320942')
    end

    # 执行SQL查询,并且逐行打印,同样用bock方式
    dbh.prepare("select * from t1") do |sth|
      sth.execute
      sth.fetch do |row|
         p row
      end
    end
end

第二种方式好处是局部变量如dbh、sth自动销毁,不用执行dbh.disconnect、sth.finish等语句。
另外它很华丽,一看就是Ruby。虽然很久没写,但我仍为卿狂。

如果SQL不是重复性执行的话,那么不必prepare,直接dbh.do也可以:
    # Don't prepare, just do it!
    dbh.do('delete from t1 where id > 10')

x9x9 发表于 2011-08-18 09:27

学习~

2gua 发表于 2011-08-18 22:33

不错不错。

兰花仙子 发表于 2012-02-04 10:36

UP下 :hug::hug::hug:

2gua 发表于 2012-02-04 11:19

仙子也灌水.....;P
页: [1]
查看完整版本: ruby扫盲之数据库篇