# database/sql 包使用

URL: https://caijiao.org/go/08-advanced/06-database-sql
Source: docs/go/08-advanced/06-database-sql.md
Description: 本节介绍 Go 标准库中 database/sql 包的基本用法，包括数据库连接、查询、执行及事务管理。

## 1. 引入包与数据库驱动

使用 database/sql 需要配合具体数据库驱动，例如 MySQL 使用 `github.com/go-sql-driver/mysql`：

```go
import (
    "database/sql"
    _ "github.com/go-sql-driver/mysql"
)
```

注意驱动包需要匿名导入。

## 2. 打开数据库连接

```go
db, err := sql.Open("mysql", "user:password@tcp(localhost:3306)/dbname")
if err != nil {
    log.Fatal(err)
}
defer db.Close()
```

`sql.Open` 不会立即建立连接，第一次操作时会自动连接。

## 3. 执行查询

### 查询单行

```go
var name string
err = db.QueryRow("SELECT name FROM users WHERE id = ?", 1).Scan(&name)
```

### 查询多行

```go
rows, err := db.Query("SELECT id, name FROM users")
defer rows.Close()

for rows.Next() {
    var id int
    var name string
    err = rows.Scan(&id, &name)
}
```

## 4. 执行插入、更新、删除

```go
result, err := db.Exec("UPDATE users SET name=? WHERE id=?", "Alice", 1)
affected, err := result.RowsAffected()
```

## 5. 事务管理

```go
tx, err := db.Begin()
if err != nil {
    log.Fatal(err)
}
_, err = tx.Exec("INSERT INTO users(name) VALUES(?)", "Bob")
if err != nil {
    tx.Rollback()
    return
}
tx.Commit()
```

## 6. 连接池设置

```go
db.SetMaxOpenConns(10)
db.SetMaxIdleConns(5)
db.SetConnMaxLifetime(time.Hour)
```

---

database/sql 包提供统一的数据库访问接口，结合具体驱动即可操作多种关系型数据库，适用于各种应用场景。
