Database/sql
外观
database/sql[编辑 | 编辑源代码]
database/sql是Go语言标准库中提供的一个通用数据库接口包,它定义了一套统一的API用于操作各种关系型数据库。该包为Go程序提供了与SQL数据库交互的标准方式,同时支持多种数据库驱动。
概述[编辑 | 编辑源代码]
database/sql包的主要特点包括:
- 提供与数据库无关的编程接口
- 支持连接池管理
- 自动处理连接的生命周期
- 支持事务处理
- 兼容多种数据库驱动
该包采用设计模式中的"驱动"架构,通过不同的驱动实现与特定数据库的通信。开发者只需学习一套API即可操作多种数据库。
基本用法[编辑 | 编辑源代码]
数据库连接[编辑 | 编辑源代码]
使用database/sql连接数据库的基本流程:
import (
"database/sql"
_ "github.com/go-sql-driver/mysql" // MySQL驱动
)
func main() {
// 打开数据库连接
db, err := sql.Open("mysql", "user:password@tcp(127.0.0.1:3306)/dbname")
if err != nil {
panic(err.Error())
}
defer db.Close()
// 验证连接
err = db.Ping()
if err != nil {
panic(err.Error())
}
}
执行查询[编辑 | 编辑源代码]
查询数据库并处理结果集的示例:
type User struct {
ID int
Name string
Age int
}
func queryUsers(db *sql.DB) ([]User, error) {
rows, err := db.Query("SELECT id, name, age FROM users WHERE age > ?", 18)
if err != nil {
return nil, err
}
defer rows.Close()
var users []User
for rows.Next() {
var u User
if err := rows.Scan(&u.ID, &u.Name, &u.Age); err != nil {
return nil, err
}
users = append(users, u)
}
return users, nil
}
执行更新[编辑 | 编辑源代码]
执行INSERT、UPDATE或DELETE语句:
func updateUser(db *sql.DB, id int, name string) error {
result, err := db.Exec("UPDATE users SET name = ? WHERE id = ?", name, id)
if err != nil {
return err
}
rowsAffected, err := result.RowsAffected()
if err != nil {
return err
}
fmt.Printf("Updated %d rows\n", rowsAffected)
return nil
}
高级特性[编辑 | 编辑源代码]
事务处理[编辑 | 编辑源代码]
database/sql支持数据库事务:
func transferMoney(db *sql.DB, from, to int, amount float64) error {
tx, err := db.Begin()
if err != nil {
return err
}
// 执行转账操作
_, err = tx.Exec("UPDATE accounts SET balance = balance - ? WHERE id = ?", amount, from)
if err != nil {
tx.Rollback()
return err
}
_, err = tx.Exec("UPDATE accounts SET balance = balance + ? WHERE id = ?", amount, to)
if err != nil {
tx.Rollback()
return err
}
return tx.Commit()
}
预处理语句[编辑 | 编辑源代码]
使用预处理语句提高性能和安全性:
func batchInsertUsers(db *sql.DB, users []User) error {
stmt, err := db.Prepare("INSERT INTO users(name, age) VALUES(?, ?)")
if err != nil {
return err
}
defer stmt.Close()
for _, u := range users {
_, err := stmt.Exec(u.Name, u.Age)
if err != nil {
return err
}
}
return nil
}
支持的数据库驱动[编辑 | 编辑源代码]
database/sql支持多种数据库驱动,常见的有:
- MySQL: github.com/go-sql-driver/mysql
- PostgreSQL: github.com/lib/pq
- SQLite: github.com/mattn/go-sqlite3
- SQL Server: github.com/denisenkom/go-mssqldb
性能优化[编辑 | 编辑源代码]
使用database/sql时的性能优化建议:
- 合理设置连接池参数(SetMaxOpenConns, SetMaxIdleConns)
- 复用预处理语句
- 使用事务批量操作
- 及时关闭Rows和Stmt对象
实际应用案例[编辑 | 编辑源代码]
database/sql广泛应用于: