Centos系统下载大全 | Redhat系统下载大全 | Windows2012系统下载大全 | Windows2008系统下载大全| CMS教程 | 网站地图 51运维网-专注Linux/Unix系统安全运维!
当前位置:51运维网 > 编程 > Ruby > 正文

Ruby MySQL DBI实例

时间:2014-08-24 23:00 来源:未知 作者:www.51ou.com 阅读:

本次章节将介绍如何用Ruby来访问数据库。类似的Perl DBI模块为Ruby脚本的Ruby DBI模块提供了一种数据库(这里用MySQL讲解)独立的接口。

  1. 获取并安装Ruby/DBI
  2. 数据库连接
  3. 插入操作
  4. 读取操作
  5. 更新操作
  6. 删除操作
  7. 执行事务
  8. 错误处理

DBI代表数据库无关的接口为Ruby DBI提供的Ruby代码和底层数据库之间的抽象层,允许你真的很容易切换数据库实现。它定义了一套方法,变量和约定来提供一致的数据库接口,独立于实际使用的数据库。

DBI可以连接以下:

  • ADO (ActiveX Data Objects)

  • DB2

  • Frontbase

  • mSQL

  • MySQL

  • ODBC

  • Oracle

  • OCI8 (Oracle)

  • PostgreSQL

  • Proxy/Server

  • SQLite

  • SQLRelay

DBI应用程序的体系结构

DBI是独立于现有的任何数据库后端。可以使用DBI操作使用Oracle,MySQL或Informix等,以下是架构示意图。

Ruby DBI Architecture

Ruby的DBI一般架构为使用两个层次:

  • 数据库接口(DBI)层。这一层是独立于数据库,并提供了一组共同的访问方法所,使用的相同的方式而不管是什么样的数据库服务器。

  • (DBD)的数据库驱动程序层。这一层是依赖于数据库,不同的驱动程序提供了访问不同的数据库引擎。驱动程序用于PostgreSQL,MySQL,InterBase 或 Oracle等等。每个驱动程序解释DBI层的请求,并将它们映射到适用于某一特定类型的数据库服务器的请求。

先决条件:

如果想编写Ruby脚本来访问MySQL数据库,那么需要安装Ruby的MySQL模块。

此模块作为一个DBD如上所述,可以直接从网上下载 http://www.tmtm.org/en/mysql/ruby/

获取并安装Ruby/DBI:

可以下载并安装Ruby DBI模块从以下位置:

http://rubyforge.org/projects/ruby-dbi/

在开始安装之前,请确保有root权限。执行以下步骤:

步骤 1

$ tar zxf dbi-0.2.0.tar.gz  

步骤 2

在distrubution目录dbi-0.2.0 和配置setup.rb的脚本在该目录中。最常用的配置命令看起来像这样,不带参数的配置参数。此命令配置分配默认情况下,安装所有的驱动程序。

$ ruby setup.rb config  

更具体地,提供了 --with 选项列出想使用的特定部位分布。例如,只配置主DBI模块和 MySQL DBD-level 驱动程序器,请发出以下命令: 

$ ruby setup.rb config --with=dbi,dbd_mysql  

步骤 3

最后一步是构建驱动程序并安装它使用下面的命令。

$ ruby setup.rb setup
$ ruby setup.rb install  

数据库连接:

假设我们要使用MySQL数据库。连接到数据库之前,请确保以下:

  • 已经创建了数据库:TESTDB.

  • 已经创建表 EMPLOYEE 在数据库 TESTDB 中.

  • 这张表有以下几个属性 FIRST_NAME, LAST_NAME, AGE, SEX 和 INCOME.

  • 用户ID "testuser" 和密码 "test123" 已经设置可以访问数据库 TESTDB

  • Ruby 模块DBI 在机器上正确安装.

  • 已经通过MySQL教程学习,了解MySQL基础知识和操作。

下面的例子连接MySQL数据库“TESTDB”

#!/usr/bin/ruby -w

require "dbi"

begin
     # connect to the MySQL server
     dbh = DBI.connect("DBI:Mysql:TESTDB:localhost", 
	                    "testuser", "test123")
     # get server version string and display it
     row = dbh.select_one("SELECT VERSION()")
     puts "Server version: " + row[0]
rescue DBI::DatabaseError => e
     puts "An error occurred"
     puts "Error code:    #{e.err}"
     puts "Error message: #{e.errstr}"
ensure
     # disconnect from server
     dbh.disconnect if dbh
end  

当运行这个脚本,它在我的Linux机器产生以下结果。

Server version: 5.0.45  

如果建立一个连接的数据源,然后继续使用,否则 dbh 设置为NILL值,e.err的和e::errstr返回错误代码和错误字符串返回,并保存到一个数据库句柄 dbh。最后出来之前,确保关闭数据库连接,并释放资源。

插入操作:

创建的记录到数据库表,INSERT操作是必需的。

建立数据库连接后,我们准备创建表或记录到数据库表的使用do 或 prepare 和 execute方法。 

使用 do 语句:

不返回行的语句能发出调用 do 数据库句柄的方法。此方法需要一个的语句字符串参数,并返回由语句影响的行数的计数。

dbh.do("DROP TABLE IF EXISTS EMPLOYEE")
dbh.do("CREATE TABLE EMPLOYEE (
     FIRST_NAME  CHAR(20) NOT NULL,
     LAST_NAME  CHAR(20),
     AGE INT,  
     SEX CHAR(1),
     INCOME FLOAT )" );  

类似的方式,可以执行 SQL INSERT 语句来创建一个记录到 EMPLOYEE 表。

#!/usr/bin/ruby -w

require "dbi"

begin
     # connect to the MySQL server
     dbh = DBI.connect("DBI:Mysql:TESTDB:localhost", 
	                    "testuser", "test123")
     dbh.do( "INSERT INTO EMPLOYEE(FIRST_NAME,
                   LAST_NAME, 
                   AGE, 
		   SEX, 
		   INCOME)
          VALUES ('Mac', 'Mohan', 20, 'M', 2000)" )
     puts "Record has been created"
     dbh.commit
rescue DBI::DatabaseError => e
     puts "An error occurred"
     puts "Error code:    #{e.err}"
     puts "Error message: #{e.errstr}"
     dbh.rollback
ensure
     # disconnect from server
     dbh.disconnect if dbh
end  

使用 prepare 和 execute:

可以使用DBI类的prepare 和 execute方法,通过Ruby的代码执行SQL语句。

创建记录需要以下步骤

  • 准备SQL语句使用INSERT语句。这项工作将使用prepare方法。

  • 执行SQL查询从数据库中选择所有的结果。这项工作将使用execute方法。

  • 释放语句句柄。这项工作使用 finish API

  • 如果一切运行正常,提交此操作,否则可以回滚完整的事务。

以下是使用这两个方法的语法:

sth = dbh.prepare(statement)
sth.execute
   ... zero or more SQL operations ...
sth.finish  

这两种方法可以用来传递值绑定到SQL语句。没有预先给定的值被输入时,可能出现一种情况。在这种情况下,绑定的值被使用。一个问号(?)是用来代替实际值和实际值通过execute() API执行完成。

下面的例子创建两个EMPLOYEE表中的记录。

#!/usr/bin/ruby -w

require "dbi"

begin
     # connect to the MySQL server
     dbh = DBI.connect("DBI:Mysql:TESTDB:localhost", 
	                    "testuser", "test123")
     sth = dbh.prepare( "INSERT INTO EMPLOYEE(FIRST_NAME,
                   LAST_NAME, 
                   AGE, 
 		   SEX, 
		   INCOME)
                   VALUES (?, ?, ?, ?, ?)" )
     sth.execute('John', 'Poul', 25, 'M', 2300)
     sth.execute('Zara', 'Ali', 17, 'F', 1000)
     sth.finish
     dbh.commit
     puts "Record has been created"
rescue DBI::DatabaseError => e
     puts "An error occurred"
     puts "Error code:    #{e.err}"
     puts "Error message: #{e.errstr}"
     dbh.rollback
ensure
     # disconnect from server
     dbh.disconnect if dbh
end  

如果有多个插入一次,然后先准备语句,然后执行内多次循环效率比通过每次调用循环要高。

读取操作:

任何数据库的读操作是指从数据库中获取一些有用的信息。

一旦我们建立数据库连接,我们已经准备好进入这个数据库进行查询。我们可以使用 do 方法或prepare 和 execute 方法来从数据库表中的取值。 

记录读取需要以下步骤

  • 准备SQL查询所需的条件的基础上。这项工作将使用prepare方法。

  • 执行SQL查询从数据库中选择所有的结果。这项工作将使用execute方法。

  • 获取所有的结果逐一打印这些结果。这项工作将可以使用fetch方法。

  • 释放语句句柄。这项工作将 finish 方法。

以下程序查询从 EMPLOYEE 表的工资超过1000的所有记录。

#!/usr/bin/ruby -w

require "dbi"

begin
     # connect to the MySQL server
     dbh = DBI.connect("DBI:Mysql:TESTDB:localhost", 
	                    "testuser", "test123")
     sth = dbh.prepare("SELECT * FROM EMPLOYEE 
                        WHERE INCOME > ?")
     sth.execute(1000)

     sth.fetch do |row|
        printf "First Name: %s, Last Name : %s\n", row[0], row[1]
        printf "Age: %d, Sex : %s\n", row[2], row[3]
        printf "Salary :%d \n\n", row[4]
     end
     sth.finish
rescue DBI::DatabaseError => e
     puts "An error occurred"
     puts "Error code:    #{e.err}"
     puts "Error message: #{e.errstr}"
ensure
     # disconnect from server
     dbh.disconnect if dbh
end  

这将产生以下结果:

First Name: Mac, Last Name : Mohan
Age: 20, Sex : M
Salary :2000

First Name: John, Last Name : Poul
Age: 25, Sex : M
Salary :2300  

如果有一次多个插入,然后先准备语句,然后执行内多次循环调用。

更新操作:

任何数据库更新操作意味着更新已经在数据库中的一个或多个记录。以下是程序更新所有性别为“M”的记录。在这里我们将所有男性年龄增加一年。这将需要三个步骤

  • 根据所需条件Prearing SQL查询。这项工作将使用prepare方法。

  • 执行SQL查询从数据库中选择所有的结果。这项工作将使用execute方法。

  • 释放语句句柄。这项工作使用 finish 方法。

  • 如果一切运行正常,然后提交此操作,否则可以回滚整个事务。

    感谢您对【51运维网 http://www.51ou.com/】的支持,我们为您免费提供《Ruby MySQL DBI实例》技术文章,《Ruby MySQL DBI实例》详细使用和说明,有时《Ruby MySQL DBI实例》可能不完善、敬请谅解!如果《Ruby MySQL DBI实例》有错误请给我们留言,我们将尽快修复文章错误,如果您觉得本站不错,请分享给周围的朋友!谢谢!

顶一下
(0)
0%
踩一下
(0)
0%
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
验证码:点击我更换图片