免费注册 查看新帖 |

Chinaunix

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

Ruby操作MYSQL数据库 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-08-24 16:22 |只看该作者 |倒序浏览
今天闲来无事,就想起来继续学习学习ruby。看看ruby的sql操作。ms在ruby当中利用mysql的比较的多。好吧,我们就开始来用mysql吧。

      想想java当中操纵数据库首先得需要一个数据库驱动,当然ruby也不例外,自然也需要一个数据库驱动。ruby当中安装数据库驱动我感觉相比较java稍微复杂一点。

    * 首先,你需要在你的mysql数据库的bin目录下将文件libmySQL.dll拷贝到ruby安装目录下的bin文件下。
    * 其次,你需要到http://rubyforge.org/projects/mysql-win当中去下载一个驱动包mysql-2.7.3-mswin32.gem
    * 接着,我们在命令行下,切换到驱动包的安装目录。运行 gem install mysql-2.7.3-mswin32.gem。OK驱动安装完毕
    * 最后,我们需要在ruby安装目录的\lib\ruby\gems\1.8\gems\mysql-2.7.3-x86-mswin32\ext 下将mysql.so文件拷贝到ruby安装目录下的\lib\ruby\site_ruby\1.8\i386-msvcrt文件当中。

      好了,万事具备,只欠东风了。我们要开始写代码了。
require  'DBcon'
begin
  dbh = Mysql.real_connect("localhost", "root", "sa","makedish", 3306)   #连接数据库本机:用户名:root 密码:sa 数据库:makedish 端口:3306
  dbh.query("drop table if exists test_foolfish")                                        #ruby执行语句
  dbh.query("create table test_foolfish(id int,name varchar(20))")
  dbh.query("insert into test_foolfish values(1,'你好')")
  dbh.query("insert into test_foolfish values(2,hello)")
  printf "%d rows were insertedn",dbh.affected_rows                        #affected_rows返回受影响的行数

  res=dbh.query("SELECT name FROM test_foolfish")
  puts "===============n"
  res.each_hash(with_table = true) do |row|
    printf "%d,%sn",row["test_rb.id"],row["test_rb.name"]
  end
  puts "===============n"
  puts "Server version:"+dbh.get_server_info
rescue Mysql::Error=>e
  puts "Error code:#{e.errno}"
  puts "Error message:#{e.error}"
  puts "Error SQLSTATE:#{e.sqlstate}" if e.respond_to?("sqlstate")
ensure
  dbh.close if dbh
end

研究以上代码,首先我们需要和数据库建立连接:
  1. dbh = Mysql.real_connect("localhost", "root", "sa","makedish", 3306)
复制代码

      这里调用Mysql模块的real_connect方法。参数就不用多说了。建立连接后我们就需要对数据库进行相应的操作。

      ruby当中对数据库存在两种操作:一种是不用返回结果集的(例如insert,update,delete等等)一种是需要返回结果集的(如select show等)。对于不返回结果集的操作,我们只需要使用dbh.query方法,传入需要执行的sql语句执行即可.转载自:小站

      对于另一种需要返回结果集的则相对麻烦一些。执行完上面类似的语句之后,我们需要对结果集进行处理。我们可以将结果集一数组或者hash形式展现。这里我们使用hash方式展现。
  1. res=dbh.query("SELECT name FROM test_foolfish")
  2.   puts "===============\n"
  3.   res.each_hash(with_table = true) do |row|
  4.     printf "%d,%s\n",row["test_rb.id"],row["test_rb.name"]
  5.   end
复制代码

     each_hash方法当中添加with_table = true参数可以保证在执行多表查询的时候,多张表具有相同字段的尴尬。这样我们hash的key值就可以用“表名.列名”的形式出现。

      怎么样,很简单吧。试一试吧。今天也只看了一点点。等研究多了,再发布点新东西

论坛徽章:
0
2 [报告]
发表于 2009-09-20 14:08 |只看该作者

论坛徽章:
0
3 [报告]
发表于 2009-09-20 14:09 |只看该作者

论坛徽章:
0
4 [报告]
发表于 2009-09-20 14:10 |只看该作者

论坛徽章:
0
5 [报告]
发表于 2010-01-26 09:13 |只看该作者
好好学习,天天向上

论坛徽章:
0
6 [报告]
发表于 2010-01-26 20:26 |只看该作者
习惯了DBI,所以只用DBI方式。

require "dbi"

dbh = DBI.connect("DBI:Mysql:mydb:localhost", "root", "")
sth = dbh.prepare("insert into domains (domain) values (?)")
['www.gmx.com','www.cnn.com','www.comcast.net'].each do |d|
    sth.execute(d)
end

sth.finish
dbh.disconnect

论坛徽章:
0
7 [报告]
发表于 2010-01-28 13:58 |只看该作者
还是用用 active_record 吧, 我开始也是用dbi的,现在都换成这个了


  1. require 'rubygems'
  2. require 'active_record'

  3. # mysql ddl.sql
  4. # -- create table `my_tests` (`id` bigint auto_increment primary key, `name` varchar(255));

  5. db = Hash[*%w[adapter mysql username my_user password my_pass database my_db]]
  6. class MyTest < ActiveRecord::Base; set_table_name 'my_tests';  end
  7. ActiveRecord::Base.establish_connection db
  8. puts MyTest.find :all
  9. o = MyTest.new
  10. o[:name] = 'test'
  11. o.save
  12. puts MyTest.find :all
复制代码

论坛徽章:
0
8 [报告]
发表于 2010-01-31 16:50 |只看该作者
呵呵,不错啊。

论坛徽章:
0
9 [报告]
发表于 2010-03-19 16:00 |只看该作者
不错!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP