当前位置:K88软件开发文章中心编程全书编程全书03 → 文章内容

Ruby 数据库访问 – DBI 教程

减小字体 增大字体 作者:佚名  来源:网上搜集  发布时间:2019-1-11 12:58:39

I第二种方法使用 transaction 方法。这个方法相对简单些,因为它需要一个包含构成事务语句的代码块。transaction 方法执行块,然后根据块是否执行成功,自动调用 commit 或 rollback:实例dbh['AutoCommit'] = false





# 设置自动提交为 falsedbh.transaction do |dbh|dbh.do("UPDATE EMPLOYEE SET AGE = AGE+1WHERE FIRST_NAME = 'John'")dbh.do("UPDATE EMPLOYEE SET AGE = AGE+1WHERE FIRST_NAME = 'Zara'")enddbh['AutoCommit'] = trueCOMMIT 操作Commit 是一种标识数据库已完成更改的操作,在这个操作后,所有的更改都不可恢复。下面是一个调用 commit 方法的简单实例。dbh.commitROLLBACK 操作如果您不满意某个或某几个更改,您想要完全恢复这些更改,则使用 rollback 方法。下面是一个调用 rollback 方法的简单实例。dbh.rollback断开数据库如需断开数据库连接,请使用 disconnect API。dbh.disconnect如果用户通过 disconnect 方法关闭了数据库连接,DBI 会回滚所有未完成的事务。但是,不需要依赖于任何 DBI 的实现细节,您的应用程序就能很好地显式调用 commit 或 rollback。处理错误有许多不同的错误来源。比如在执行 SQL 语句时的语法错误,或者是连接失败,又或者是对一个已经取消的或完成的语句句柄调用 fetch 方法。如果某个 DBI 方法失败,DBI 会抛出异常。DBI 方法会抛出任何类型的异常,但是最重要的两种异常类是 DBI:





:





InterfaceError 和 DBI:





:





DatabaseError。这些类的 Exception 对象有 err、errstr 和 state 三种属性,分表代表了错误号、一个描述性的错误字符串和一个标准的错误代码。属性具体说明如下:err:返回所发生的错误的整数表示法,如果 DBD 不支持则返回 nil。例如,Oracle DBD 返回 ORA-XXXX 错误消息的数字部分。errstr:返回所发生的错误的字符串表示法。state:返回所发生的错误的 SQLSTATE 代码。SQLSTATE 是五字符长度的字符串。大多数的 DBD 并不支持它,所以会返回 nil。在上面的实例中您已经看过下面的代码:rescue DBI:





:





DatabaseError => eputs "An error occurred"puts "Error code:











#{e.err}"puts "Error message:











#{e.errstr}"dbh.rollbackensure





# 断开与服务器的连接dbh.disconnect if dbhend为了获取脚本执行时有关脚本执行内容的调试信息,您可以启用跟踪。为此,您必须首先下载 dbi/trace 模块,然后调用控制跟踪模式和输出目的地的 trace 方法:require "dbi/trace"..............trace(mode, destination)mode 的值可以是 0(off)、1、2 或 3,destination 的值应该是一个 IO 对象。默认值分别是 2 和 STDERR。方法的代码块有一些创建句柄的方法。这些方法通过代码块调用。使用带有方法的代码块的优点是,它们为代码块提供了句柄作为参数,当块终止时会自动清除句柄。下面是一些实例,有助于理解这个概念。DBI.connect :该方法生成一个数据库句柄,建议在块的末尾调用 disconnect 来断开数据库。dbh.prepare :该方法生成一个语句句柄,建议在块的末尾调用 finish。在块内,您必须调用 execute 方法来执行语句。dbh.execute :该方法与 dbh.prepare 类似,但是 dbh.execute 不需要在块内调用 execute 方法。语句句柄会自动执行。实例 1DBI.connect 可带有一个代码块,向它传递数据库句柄,且会在块的末尾自动断开句柄。dbh = DBI.connect("DBI:





Mysql:





TESTDB:





localhost", "testuser", "test123") do |dbh|实例 2dbh.prepare 可带有一个代码块,向它传递语句句柄,且会在块的末尾自动调用 finish。dbh.prepare("SHOW DATABASES") do |sth|sth.executeputs "Databases:





" + sth.fetch_all.join(", ")end实例 3dbh.execute 可带有一个代码块,向它传递语句句柄,且会在块的末尾自动调用 finish。dbh.execute("SHOW DATABASES") do |sth|puts "Databases:





" + sth.fetch_all.join(", ")endDBI transaction 方法也可带有一个代码块,这在上面的章节中已经讲解过了。特定驱动程序的函数和属性DBI 让数据库驱动程序提供了额外的特定数据库的函数,这些函数可被用户通过任何 Handle 对象的 func 方法进行调用。使用 []= or [] 方法可以设置或获取特定驱动程序的属性。DBD:





:





Mysql 实现了下列特定驱动程序的函数:序号函数 & 描述1dbh.func(:





createdb, db_name)创建一个新的数据库。2dbh.func(:





dropdb, db_name)删除一个数据库。3dbh.func(:





reload)执行重新加载操作。4dbh.func(:





shutdown)关闭服务器。5dbh.func(:





insert_id) => Fixnum返回该连接的最近 AUTO_INCREMENT 值。6dbh.func(:





client_info) => String根据版本返回 MySQL 客户端信息。7dbh.func(:





client_version) => Fixnum 根据版本返回客户端信息。这与 :





client_info 类似,但是它会返回一个 fixnum,而不是返回字符串。8dbh.func(:





host_info) => String返回主机信息。9dbh.func(:





proto_info) => Fixnum返回用于通信的协议。10dbh.func(:





server_info) => String 根据版本返回 MySQL 服务器端信息。11dbh.func(:





stat) => Stringb>返回数据库的当前状态。12dbh.func(:





thread_id) => Fixnum返回当前线程的 ID。实例





#!/usr/bin/ruby require "dbi"begin





# 连接到 MySQL 服务器 dbh = DBI.connect("DBI:





Mysql:





TESTDB:





localhost", "testuser", "test123") puts dbh.func(:





client_info) puts dbh.func(:





client_version) puts dbh.func(:





host_info) puts dbh.func(:





proto_info) puts dbh.func(:





server_info) puts dbh.func(:





thread_id) puts dbh.func(:





stat)rescue DBI:





:





DatabaseError => e puts "An error occurred" puts "Error code:











#{e.err}" puts "Error message:











#{e.errstr}"ensure dbh.disconnect if dbhend这将产生以下结果:5.0.4550045Localhost via UNIX socket105.0.45150621Uptime:





384981 Threads:





1 Questions:





1101078 Slow queries:





4 \Opens:





324 Flush tables:





1 Open tables:





64 \Queries per second avg:





2.860

上一页  [1] [2] [3] 


Ruby 数据库访问 – DBI 教程