Ruby操作MySQL

Ruby 操作 Mysql 主要包括 INSERT 操作、READ 操作、Update 操作、DELETE 操作等。

INSERT操作

当您想要在数据库表中创建记录时,需要用到 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 # 连接到 MySQL 服务器 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 # 断开与服务器的连接 dbh.disconnect if dbh end

使用prepare和execute

您可以使用 DBI 的 prepare 和 execute 方法来执行 Ruby 代码中的 SQL 语句。创建记录的步骤如下:

  1. 准备带有 INSERT 语句的 SQL 语句。这将通过使用 prepare 方法来完成。
  2. 执行 SQL 查询,从数据库中选择所有的结果。这将通过使用 execute 方法来完成。
  3. 释放语句句柄。这将通过使用 finish API 来完成。
  4. 如果一切进展顺利,则 commit 该操作,否则您可以 rollback 完成交易。

下面是使用这两种方法的语法:

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

这两种方法可用于传 bind 值给 SQL 语句。有时候被输入的值可能未事先给出,在这种情况下,则会用到绑定值。使用问号(?)替代实际值,实际值通过 execute() API 来传递。

下面的实例在 EMPLOYEE 表中创建了两个记录:

#!/usr/bin/ruby -w require "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.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 # 断开与服务器的连接 dbh.disconnect if dbh end

如果同时使用多个 INSERT,那么先准备一个语句,然后在一个循环中多次执行它要比通过循环每次调用 do 有效率得多。

READ操作

对任何数据库的 READ 操作是指从数据库中获取有用的信息。一旦建立了数据库连接,我们就可以准备查询数据库。我们可以使用 do 方法或 prepare 和 execute 方法从数据库表中获取值。

获取记录的步骤如下:

  1. 基于所需的条件准备 SQL 查询。这将通过使用 prepare 方法来完成。
  2. 执行 SQL 查询,从数据库中选择所有的结果。这将通过使用 execute 方法来完成。
  3. 逐一获取结果,并输出这些结果。这将通过使用 fetch 方法来完成。
  4. 释放语句句柄。这将通过使用 finish 方法来完成。

下面的实例从 EMPLOYEE 表中查询所有工资(salary)超过 1000 的记录。

#!/usr/bin/ruby -w require "dbi" begin # 连接到 MySQL 服务器 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 # 断开与服务器的连接 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

Update操作

对任何数据库的 UPDATE 操作是指更新数据库中一个或多个已有的记录。下面的实例更新 SEX 为 ‘M’ 的所有记录。在这里,我们将把所有男性的 AGE 增加一岁。这将分为三步:

  1. 基于所需的条件准备 SQL 查询。这将通过使用 prepare 方法来完成。
  2. 执行 SQL 查询,从数据库中选择所有的结果。这将通过使用 execute 方法来完成。
  3. 释放语句句柄。这将通过使用 finish 方法来完成。
  4. 如果一切进展顺利,则 commit 该操作,否则您可以 rollback 完成交易。
#!/usr/bin/ruby -w require "dbi" begin # 连接到 MySQL 服务器 dbh = DBI.connect("DBI:Mysql:TESTDB:localhost", "testuser", "test123") sth = dbh.prepare("UPDATE EMPLOYEE SET AGE = AGE + 1 WHERE SEX = ?") sth.execute('M') sth.finish dbh.commit rescue DBI::DatabaseError => e puts "An error occurred" puts "Error code: #{e.err}" puts "Error message: #{e.errstr}" dbh.rollback ensure # 断开与服务器的连接 dbh.disconnect if dbh end

DELETE操作

当您想要从数据库中删除记录时,需要用到 DELETE 操作。下面的实例从 EMPLOYEE 中删除 AGE 超过 20 的所有记录。该操作的步骤如下:

  1. 基于所需的条件准备 SQL 查询。这将通过使用 prepare 方法来完成。
  2. 执行 SQL 查询,从数据库中删除所需的记录。这将通过使用 execute 方法来完成。
  3. 释放语句句柄。这将通过使用 finish 方法来完成。
  4. 如果一切进展顺利,则 commit 该操作,否则您可以 rollback 完成交易。
#!/usr/bin/ruby -w require "dbi" begin # 连接到 MySQL 服务器 dbh = DBI.connect("DBI:Mysql:TESTDB:localhost", "testuser", "test123") sth = dbh.prepare("DELETE FROM EMPLOYEE WHERE AGE > ?") sth.execute(20) sth.finish dbh.commit rescue DBI::DatabaseError => e puts "An error occurred" puts "Error code: #{e.err}" puts "Error message: #{e.errstr}" dbh.rollback ensure # 断开与服务器的连接 dbh.disconnect if dbh end