Ruby 提供了多种方式与数据库交互,其中 DBI(Database Interface) 是一个通用接口库,类似于 Perl 的 DBI,使 Ruby 可以使用相同的 API 访问不同的数据库,如 MySQL、PostgreSQL、SQLite、Oracle 等。


📌 目录

  1. 🔹 什么是 DBI?
  2. 🔹 安装 DBI 和数据库驱动
  3. 🔹 连接数据库
  4. 🔹 执行 SQL 查询
  5. 🔹 处理查询结果
  6. 🔹 使用占位符(Prepared Statement)
  7. 🔹 插入、更新和删除数据
  8. 🔹 事务控制(Commit & Rollback)
  9. 🔹 关闭数据库连接
  10. 🔹 DBI 连接池
  11. 🔹 参考资料

🔹 什么是 DBI?

DBI(Database Interface)是 Ruby 提供的数据库访问 API,可以通过不同的数据库适配器(DBD,Database Driver)连接到 MySQL、PostgreSQL、SQLite 等数据库。DBI 主要包含:

  • DBI:数据库接口库,提供通用 API。
  • DBD(Database Driver):具体数据库驱动(如 DBD::MySQLDBD::Pg)。

支持的数据库

数据库驱动名称
MySQLDBD::MySQL
PostgreSQLDBD::Pg
SQLiteDBD::SQLite3
OracleDBD::Oracle
ODBCDBD::ODBC

🔹 安装 DBI 和数据库驱动

1. 安装 DBI

gem install dbi

2. 安装 MySQL 驱动

gem install dbd-mysql

3. 安装 PostgreSQL 驱动

gem install dbd-pg

4. 安装 SQLite 驱动

gem install sqlite3
gem install dbd-sqlite3


🔹 连接数据库

1. 连接 MySQL

require 'dbi'

begin
  dbh = DBI.connect("DBI:Mysql:database_name:localhost", "username", "password")
  puts "成功连接到 MySQL 数据库"
rescue DBI::DatabaseError => e
  puts "数据库错误: #{e.err}"
ensure
  dbh.disconnect if dbh
end

2. 连接 SQLite

dbh = DBI.connect("DBI:SQLite3:my_database.db")

3. 连接 PostgreSQL

dbh = DBI.connect("DBI:Pg:dbname=mydb;host=localhost", "user", "password")


🔹 执行 SQL 查询

1. 运行 SQL 语句

dbh.do("CREATE TABLE users (id INT PRIMARY KEY, name VARCHAR(50))")

2. 插入数据

dbh.do("INSERT INTO users (id, name) VALUES (1, 'Alice')")


🔹 处理查询结果

sth = dbh.prepare("SELECT * FROM users")
sth.execute

sth.fetch do |row|
  puts "ID: #{row[0]}, Name: #{row[1]}"
end

sth.finish


🔹 使用占位符(Prepared Statement)

sth = dbh.prepare("INSERT INTO users (id, name) VALUES (?, ?)")
sth.execute(2, "Bob")
sth.finish


🔹 插入、更新和删除数据

1. 插入

dbh.do("INSERT INTO users (id, name) VALUES (3, 'Charlie')")

2. 更新

dbh.do("UPDATE users SET name = 'David' WHERE id = 3")

3. 删除

dbh.do("DELETE FROM users WHERE id = 3")


🔹 事务控制(Commit & Rollback)

dbh.transaction do
  dbh.do("INSERT INTO users (id, name) VALUES (4, 'Eve')")
  dbh.commit  # 提交事务
rescue DBI::DatabaseError
  dbh.rollback  # 回滚事务
end


🔹 关闭数据库连接

dbh.disconnect if dbh


🔹 DBI 连接池

为了优化数据库连接,可以使用连接池:

require 'dbi'

DBI.connect("DBI:Mysql:database_name:localhost", "user", "password") do |dbh|
  dbh.do("SELECT * FROM users")  # 自动关闭连接
end


🔹 参考资料


这份教程详细介绍了 Ruby DBI 的使用,涵盖 安装、连接数据库、查询、插入、更新、删除、事务 等核心操作。你可以根据你的数据库类型选择合适的 DBD 驱动。🚀