mysql2 是 Ruby 访问 MySQL 数据库的首选库,比 dbi 更现代、性能更优,支持 线程安全流式查询参数化查询,推荐用于生产环境。


📌 目录

  1. 🔹 安装 mysql2 Gem
  2. 🔹 连接 MySQL 数据库
  3. 🔹 执行 SQL 语句
  4. 🔹 处理查询结果
  5. 🔹 使用占位符(Prepared Statement)
  6. 🔹 插入、更新和删除数据
  7. 🔹 事务控制(Commit & Rollback)
  8. 🔹 连接池(Connection Pooling)
  9. 🔹 关闭数据库连接
  10. 🔹 参考资料

🔹 安装 mysql2 Gem

1. 安装 MySQL2 gem
在终端执行以下命令安装 mysql2

gem install mysql2

2. 检查安装是否成功

ruby -e "require 'mysql2'; puts 'MySQL2 安装成功!'"


🔹 连接 MySQL 数据库

require 'mysql2'

begin
  client = Mysql2::Client.new(
    host: "localhost",
    username: "root",
    password: "your_password",
    database: "test_db",
    encoding: "utf8mb4"
  )
  puts "✅ 成功连接到 MySQL 数据库!"
rescue Mysql2::Error => e
  puts "❌ 连接失败: #{e.message}"
end

连接参数说明

参数说明
hostMySQL 服务器地址(本地 localhost,远程填 IP 或域名)
username数据库用户名
password数据库密码
database连接的数据库名
encoding数据库编码(建议使用 utf8mb4 以支持 Emoji)

🔹 执行 SQL 语句

1. 创建数据库

client.query("CREATE DATABASE IF NOT EXISTS test_db")

2. 选择数据库

client.query("USE test_db")

3. 创建表

client.query("
  CREATE TABLE IF NOT EXISTS users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(50),
    age INT
  )
")


🔹 处理查询结果

1. 查询所有数据

results = client.query("SELECT * FROM users")

results.each do |row|
  puts "ID: #{row['id']}, Name: #{row['name']}, Age: #{row['age']}"
end

2. 查询单行数据

row = client.query("SELECT * FROM users WHERE id = 1").first
puts "用户: #{row['name']}, 年龄: #{row['age']}" if row


🔹 使用占位符(Prepared Statement)

使用 预处理语句 避免 SQL 注入,提高查询效率:

statement = client.prepare("INSERT INTO users (name, age) VALUES (?, ?)")
statement.execute("Alice", 25)
statement.execute("Bob", 30)


🔹 插入、更新和删除数据

1. 插入数据

client.query("INSERT INTO users (name, age) VALUES ('Charlie', 28)")

2. 更新数据

client.query("UPDATE users SET age = 29 WHERE name = 'Charlie'")

3. 删除数据

client.query("DELETE FROM users WHERE name = 'Charlie'")


🔹 事务控制(Commit & Rollback)

1. 事务提交

client.query("START TRANSACTION")
client.query("INSERT INTO users (name, age) VALUES ('David', 22)")
client.query("COMMIT")  # 提交事务

2. 事务回滚

client.query("START TRANSACTION")
client.query("INSERT INTO users (name, age) VALUES ('Eve', 24)")
client.query("ROLLBACK")  # 取消插入


🔹 连接池(Connection Pooling)

在高并发环境中,使用连接池管理数据库连接:

require 'mysql2'
require 'connection_pool'

pool = ConnectionPool.new(size: 5, timeout: 5) do
  Mysql2::Client.new(host: "localhost", username: "root", password: "your_password", database: "test_db", encoding: "utf8mb4")
end

# 使用连接池
pool.with do |client|
  results = client.query("SELECT * FROM users")
  results.each { |row| puts row["name"] }
end


🔹 关闭数据库连接

client.close if client

或者:

pool.shutdown


🔹 参考资料


总结

  • mysql2 提供 高性能线程安全 的 MySQL 访问方式。
  • 通过 client.query("SQL") 执行 SQL 语句,使用 client.prepare 进行 参数化查询
  • 事务 (START TRANSACTION, COMMIT, ROLLBACK) 适用于 数据一致性 场景。
  • 连接池 (ConnectionPool) 适用于 高并发应用,避免重复建立连接。

你可以将本教程作为 MySQL2 最佳实践 指南,用于 Web 开发、数据存储、API 应用 等项目 🚀