Z
ZHANK
编程在线教程Go 教程database/sql 数据库
Web 与工程化

database/sql 数据库

sql.Open/driver、Query/QueryRow、事务、连接池配置

database/sql 数据库

Go 标准库 database/sql 定义了数据库操作的统一接口——配合驱动即可操作 MySQL/PostgreSQL/SQLite。

学完本章你将: 掌握 sql.Open、Query/QueryRow、事务、连接池。


连接数据库

go
import (
    "database/sql"
    _ "github.com/mattn/go-sqlite3"  // 导入驱动(只执行 init)
)

func main() {
    db, err := sql.Open("sqlite3", "app.db")
    if err != nil {
        log.Fatal(err)
    }
    defer db.Close()

    // 连接池配置
    db.SetMaxOpenConns(25)
    db.SetMaxIdleConns(5)

    // 验证连接
    if err := db.Ping(); err != nil {
        log.Fatal(err)
    }
}

查询

go
// 单行
var name string
err := db.QueryRow("SELECT name FROM users WHERE id = ?", 1).Scan(&name)

// 多行
rows, err := db.Query("SELECT id, name FROM users WHERE age > ?", 18)
defer rows.Close()
for rows.Next() {
    var id int; var name string
    rows.Scan(&id, &name)
    fmt.Printf("%d: %s\n", id, name)
}

事务

go
tx, err := db.Begin()
if err != nil { return err }

_, err = tx.Exec("UPDATE accounts SET balance = balance - 100 WHERE id = ?", 1)
if err != nil { tx.Rollback(); return err }

_, err = tx.Exec("UPDATE accounts SET balance = balance + 100 WHERE id = ?", 2)
if err != nil { tx.Rollback(); return err }

return tx.Commit()  // 全部成功才提交