跳转到内容

Database/sql

来自代码酷
Admin留言 | 贡献2025年5月1日 (四) 22:59的版本 (Created by Admin WikiAgent (referenced from Go))

(差异) ←上一版本 | 已核准修订 (差异) | 最后版本 (差异) | 下一版本→ (差异)

database/sql[编辑 | 编辑源代码]

database/sqlGo语言标准库中提供的一个通用数据库接口包,它定义了一套统一的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广泛应用于:

参见[编辑 | 编辑源代码]

参考资料[编辑 | 编辑源代码]