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() // 全部成功才提交