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

Ruby 数据库访问 – DBI 教程

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

则您可以 rollback 完成交易。下面是使用这两种方法的语法:实例sth = dbh.prepare(statement)sth.execute... zero or more SQL operations ...sth.finish这两种方法可用于传 bind 值给 SQL 语句。有时候被输入的值可能未事先给出,在这种情况下,则会用到绑定值。使用问号(?)替代实际值,实际值通过 execute() API 来传递。下面的实例在 EMPLOYEE 表中创建了两个记录:实例





#!/usr/bin/ruby -wrequire "dbi"begin





# 连接到 MySQL 服务器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.finishdbh.commitputs "Record has been created"rescue DBI:





:





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











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











#{e.errstr}"dbh.rollbackensure





# 断开与服务器的连接dbh.disconnect if dbhend如果同时使用多个 INSERT,那么先准备一个语句,然后在一个循环中多次执行它要比通过循环每次调用 do 有效率得多。READ 操作对任何数据库的 READ 操作是指从数据库中获取有用的信息。一旦建立了数据库连接,我们就可以准备查询数据库。我们可以使用 do 方法或 prepare 和 execute 方法从数据库表中获取值。获取记录的步骤如下:基于所需的条件准备 SQL 查询。这将通过使用 prepare 方法来完成。执行 SQL 查询,从数据库中选择所有的结果。这将通过使用 execute 方法来完成。逐一获取结果,并输出这些结果。这将通过使用 fetch 方法来完成。释放语句句柄。这将通过使用 finish 方法来完成。下面的实例从 EMPLOYEE 表中查询所有工资(salary)超过 1000 的记录。实例





#!/usr/bin/ruby -wrequire "dbi"begin





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





Mysql:





TESTDB:





localhost","testuser", "test123")sth = dbh.prepare("SELECT * FROM EMPLOYEEWHERE 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]endsth.finishrescue DBI:





:





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











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











#{e.errstr}"ensure





# 断开与服务器的连接dbh.disconnect if dbhend这将产生以下结果:First Name:





Mac, Last Name :





MohanAge:





20, Sex :





MSalary :





2000First Name:





John, Last Name :





PoulAge:





25, Sex :





MSalary :





2300还有很多从数据库获取记录的方法,如果您感兴趣,可以查看 Ruby DBI Read 操作。Update 操作对任何数据库的 UPDATE 操作是指更新数据库中一个或多个已有的记录。下面的实例更新 SEX 为 'M' 的所有记录。在这里,我们将把所有男性的 AGE 增加一岁。这将分为三步:基于所需的条件准备 SQL 查询。这将通过使用 prepare 方法来完成。执行 SQL 查询,从数据库中选择所有的结果。这将通过使用 execute 方法来完成。释放语句句柄。这将通过使用 finish 方法来完成。如果一切进展顺利,则 commit 该操作,否则您可以 rollback 完成交易。实例





#!/usr/bin/ruby -wrequire "dbi"begin





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





Mysql:





TESTDB:





localhost","testuser", "test123")sth = dbh.prepare("UPDATE EMPLOYEE SET AGE = AGE + 1WHERE SEX = ?")sth.execute('M')sth.finishdbh.commitrescue DBI:





:





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











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











#{e.errstr}"dbh.rollbackensure





# 断开与服务器的连接dbh.disconnect if dbhendDELETE 操作当您想要从数据库中删除记录时,需要用到 DELETE 操作。下面的实例从 EMPLOYEE 中删除 AGE 超过 20 的所有记录。该操作的步骤如下:基于所需的条件准备 SQL 查询。这将通过使用 prepare 方法来完成。执行 SQL 查询,从数据库中删除所需的记录。这将通过使用 execute 方法来完成。释放语句句柄。这将通过使用 finish 方法来完成。如果一切进展顺利,则 commit 该操作,否则您可以 rollback 完成交易。实例





#!/usr/bin/ruby -wrequire "dbi"begin





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





Mysql:





TESTDB:





localhost","testuser", "test123")sth = dbh.prepare("DELETE FROM EMPLOYEEWHERE AGE > ?")sth.execute(20)sth.finishdbh.commitrescue DBI:





:





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











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











#{e.errstr}"dbh.rollbackensure





# 断开与服务器的连接dbh.disconnect if dbhend执行事务事务是一种确保交易一致性的机制。事务应具有下列四种属性:原子性(Atomicity):事务的原子性指的是,事务中包含的程序作为数据库的逻辑工作单位,它所做的对数据修改操作要么全部执行,要么完全不执行。一致性(Consistency):事务的一致性指的是在一个事务执行之前和执行之后数据库都必须处于一致性状态。假如数据库的状态满足所有的完整性约束,就说该数据库是一致的。 隔离性(Isolation):事务的隔离性指并发的事务是相互隔离的,即一个事务内部的操作及正在操作的数据必须封锁起来,不被其它企图进行修改的事务看到。持久性(Durability):事务的持久性意味着当系统或介质发生故障时,确保已提交事务的更新不能丢失。即一旦一个事务提交,它对数据库中数据的改变应该是永久性的,耐得住任何数据库系统故障。持久性通过数据库备份和恢复来保证。DBI 提供了两种执行事务的方法。一种是 commit 或 rollback 方法,用于提交或回滚事务。还有一种是 transaction 方法,可用于实现事务。接下来我们来介绍这两种简单的实现事务的方法:方法 I第一种方法使用 DBI 的 commit 和 rollback 方法来显式地提交或取消事务:实例dbh['AutoCommit'] = false





# 设置自动提交为 false.begindbh.do("UPDATE EMPLOYEE SET AGE = AGE+1WHERE FIRST_NAME = 'John'")dbh.do("UPDATE EMPLOYEE SET AGE = AGE+1WHERE FIRST_NAME = 'Zara'")dbh.commitrescueputs "transaction failed"dbh.rollbackenddbh['AutoCommit'] = true方法 I

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


Ruby 数据库访问 – DBI 教程