免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3324 | 回复: 1
打印 上一主题 下一主题

使用Ruby DBI模块 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-03-02 12:04 |只看该作者 |倒序浏览
使用Ruby DBI模块







原本的DBI模块的安装教程:

1.安装
首先,我是使用mysql进行测试的,你的机器上需要安装mysql数据库。
然后执行:
gem install mysql

到rubyforge下载ruby-DBI,解压后cd到目录运行如下命令:
ruby setup.rb config --with=dbi,dbd_mysql
ruby setup.rb setup
ruby setup.rb install

完整的setup命令参数参考DBI的doc

2.完整例子
DBI是一类似于ODBC的开发式的统一的数据库编程接口,结构层次上可以分为两层:
1.Database Interface——数据库接口层,与数据库无关,提供与数据库无关的标准接口
2.Database Driver——数据库驱动,与数据库相关

DBI也是很简单易用的,一个完整的使用例子,对于初学者可能有点帮助:
  1. require 'dbi'
  2. begin
  3.   #连接数据库
  4.   dbh=DBI.connect("DBI:Mysql:dbi_test:localhost","root","")
  5.   
  6.   dbh.columns("simple").each do |h|
  7.     p h
  8.   end
  9.   #示范3种事务处理方式
  10.   #手动commit
  11.   dbh["AutoCommit"]=false
  12.   1.upto(10) do |i|
  13.     sql = "insert into simple (name, author) VALUES (?, ?)"
  14.     dbh.do(sql, "Song #{i}", "#{i}")
  15.   end
  16.   dbh.commit
  17.   
  18.   #使用transaction方法
  19.   dbh.transaction do |dbh|
  20.     1.upto(10) do |i|
  21.       sql = "insert into simple (name, author) VALUES (?, ?)"
  22.       dbh.do(sql, "Song #{i}", "#{i}")
  23.     end
  24.   end
  25.   
  26.   #使用SQL语句
  27.   dbh.do("SET AUTOCOMMIT=0")
  28.   dbh.do("BEGIN")
  29.   dbh["AutoCommit"]=false
  30.   dbh.do("UPDATE simple set name='test' where id='1'")
  31.   dbh.do("COMMIT")
  32.   
  33.   #查询
  34.   sth=dbh.execute("select count(id) from simple")
  35.   puts "bookCount:#{sth.fetch[0]}"
  36.   sth.finish
  37.   begin
  38.     sth=dbh.prepare("select * from simple")
  39.     sth.execute
  40.     while row=sth.fetch do
  41.       p row
  42.     end
  43.     sth.finish
  44.   rescue
  45.   end
  46.   
  47.   #上面这段查询可以改写为:
  48.   #dbh.select_all("select * from simple") do |row|
  49.   #   p row
  50.   #end   
复制代码
#使用工具类输出xml格式结果集以及测量查询时间
  1.   sql="select * from simple"
  2.   mesuretime=DBI::Utils::measure do
  3.     sth=dbh.execute(sql)
  4.   end
  5.   puts "SQL:#{sql}"
  6.   puts "Time:#{mesuretime}"
  7.   rows=sth.fetch_all
  8.   col_names=sth.column_names
  9.   sth.finish
  10.   puts DBI::Utils::XMLFormatter.table(rows)
  11.   
  12.   dbh.do("delete from simple")
  13. rescue  DBI::DatabaseError=>e
  14.   puts "error code:#{e.err}"
  15.   puts "Error message:#{e.errstr}"
  16. ensure
  17.   dbh.disconnect if dbh
  18. end
复制代码
出现问题:
但是每次我执行第一步的时候就会出现 config: unknown option --with=dbi,dbd_mysql Try 'ruby setup.rb --help' for detailed usage.
原因分析:
这是由于dbi版本问题造成的。
因此新版本的安装方式如下:
一般方法是:下载dbi(tar.gz或zip格式),CMD下切换到解压的目录,使用以下命令:
  1. ruby setup.rb config (或ruby setup.rb config --with=dbi,dbd_mysql)

  2. ruby setup.rb setup

  3. ruby setup.rb install
复制代码
报错:


ir
  1. b(main):001:0> require 'dbi'
  2. LoadError: no such file to load -- deprecated
  3.         from <internal:lib/rubygems/custom_require>:29:in `require'
  4.         from <internal:lib/rubygems/custom_require>:29:in `require'
  5.         from C:/MyProgramFiles/Ruby192/lib/ruby/site_ruby/1.9.1/dbi.rb:48:in `<t
  6. op (required)>'
  7.         from <internal:lib/rubygems/custom_require>:29:in `require'
  8.         from <internal:lib/rubygems/custom_require>:29:in `require'
  9.         from (irb):1
  10.         from C:/MyProgramFiles/Ruby192/bin/irb:12:in `<main>'
  11. irb(main):002:0>
复制代码
这个问题比较简单,只要安装一个deprecated包,于是我下载了deprecated-3.0.0.gem,安装之后还是报错。
  1. irb(main):001:0> require 'dbi'
  2. NoMethodError: undefined method `deprecate' for DBI::Date:Class
  3.         from C:/MyProgramFiles/Ruby192/lib/ruby/site_ruby/1.9.1/dbi/utils/date.r
  4. b:57:in `<class:Date>'
  5.         from C:/MyProgramFiles/Ruby192/lib/ruby/site_ruby/1.9.1/dbi/utils/date.r
  6. b:7:in `<module:DBI>'
  7.         from C:/MyProgramFiles/Ruby192/lib/ruby/site_ruby/1.9.1/dbi/utils/date.r
  8. b:1:in `<top (required)>'
  9.         from <internal:lib/rubygems/custom_require>:29:in `require'
  10.         from <internal:lib/rubygems/custom_require>:29:in `require'
  11.         from C:/MyProgramFiles/Ruby192/lib/ruby/site_ruby/1.9.1/dbi/utils.rb:56:
  12. in `<top (required)>'
  13.         from <internal:lib/rubygems/custom_require>:29:in `require'
  14.         from <internal:lib/rubygems/custom_require>:29:in `require'
  15.         from C:/MyProgramFiles/Ruby192/lib/ruby/site_ruby/1.9.1/dbi.rb:50:in `<t
  16. op (required)>'
  17.         from <internal:lib/rubygems/custom_require>:29:in `require'
  18.         from <internal:lib/rubygems/custom_require>:29:in `require'
  19.         from (irb):1
  20.         from C:/MyProgramFiles/Ruby192/bin/irb:12:in `<main>'
  21. irb(main):002:0>
复制代码
再次Google,居然是deprecated-3.0.0.gem太新了!换成deprecated-2.0.1.gem就可以了。
  1. irb(main):001:0> require 'dbi'  
  2. => true  
  3. irb(main):002:0>
复制代码
这个问题还是比较容易解决的,不过要是出现如下问题就不好解决了:
  1. <internal:lib/rubygems/custom_require>:29:in `require': no such file to load -- parsedate (LoadError)
  2.         from <internal:lib/rubygems/custom_require>:29:in `require'
  3.         from c:/Program Files (x86)/RailsInstaller/Ruby1.9.2/lib/ruby/site_ruby/1.9.1/dbi/sql.rb:9:in `<module:DBI>'
  4.         from c:/Program Files (x86)/RailsInstaller/Ruby1.9.2/lib/ruby/site_ruby/1.9.1/dbi/sql.rb:7:in `<top (required)>'
  5.         from <internal:lib/rubygems/custom_require>:29:in `require'
  6.         from <internal:lib/rubygems/custom_require>:29:in `require'
  7.         from c:/Program Files (x86)/RailsInstaller/Ruby1.9.2/lib/ruby/site_ruby/1.9.1/dbi.rb:37:in `<top (required)>'
  8.         from <internal:lib/rubygems/custom_require>:29:in `require'
  9.         from <internal:lib/rubygems/custom_require>:29:in `require'
  10.         from E:/Program/Eclipse/RubyTest/dbi.rb:1:in `<main>'
复制代码
经过查询之后,才发现原来parsedate在ruby1.9.2中已经被废除了,现在使用的是date。因此这个版本问题真的是没有办法进行解决啦。我现在正在考虑要不要把ruby降级来解决这个问题。尝试中,后面如果解决了会进行更新。

论坛徽章:
0
2 [报告]
发表于 2012-03-02 12:05 |只看该作者
谢谢分享
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP