Golang如何遍历MySQL查询结果

在Golang中遍历MySQL查询结果,主要通过database/sql标准库结合MySQL驱动执行查询,并使用Rows.Scan()方法逐行读取数据来实现,以下将详细说明具体步骤、代码示例及关键注意事项。

安装驱动与建立连接

使用go get安装MySQL驱动(如github.com/go-sql-driver/mysql),并通过sql.Open()初始化数据库连接:

golang如何遍历mysql,高效遍历MySQL的Golang实践

import (
    "database/sql"
    _ "github.com/go-sql-driver/mysql"
)
func main() {
    db, err := sql.Open("mysql", "user:password@tcp(127.0.0.1:3306)/dbname")
    if err != nil {
        panic(err)
    }
    defer db.Close()
}

执行查询并遍历结果

使用db.Query()执行SQL语句,返回的*sql.Rows对象需通过rows.Next()循环遍历,并通过rows.Scan()将每行数据映射到变量中:

rows, err := db.Query("SELECT id, name FROM users")
if err != nil {
    panic(err)
}
defer rows.Close()
for rows.Next() {
    var id int
    var name string
    err = rows.Scan(&id, &name)
    if err != nil {
        panic(err)
    }
    fmt.Printf("ID: %d, Name: %s\n", id, name)
}

关键点:务必使用defer rows.Close()确保资源释放,并在循环后检查rows.Err()处理遍历中的错误。

处理多列或动态字段

若列数不确定,可使用rows.Columns()获取列名,结合[]interface{}切片动态接收数据:

cols, _ := rows.Columns()
values := make([]interface{}, len(cols))
valuePtrs := make([]interface{}, len(cols))
for rows.Next() {
    for i := range values {
        valuePtrs[i] = &values[i]
    }
    rows.Scan(valuePtrs...)
    // 处理values中的数据
}

性能与注意事项

  • 使用预处理语句:频繁查询时建议用db.Prepare()提升效率与安全性。
  • 批量操作优化:大数据量遍历可结合LIMIT分页或流式处理减少内存占用。
  • 错误处理:始终检查rows.Err(),避免隐藏错误导致逻辑异常。

完整示例

以下是一个从查询到遍历的完整代码片段:

func queryUsers(db *sql.DB) {
    rows, err := db.Query("SELECT id, email FROM users WHERE active=?", true)
    if err != nil {
        log.Fatal(err)
    }
    defer rows.Close()
    for rows.Next() {
        var id int
        var email string
        if err := rows.Scan(&id, &email); err != nil {
            log.Fatal(err)
        }
        fmt.Printf("User %d: %s\n", id, email)
    }
    if err := rows.Err(); err != nil {
        log.Fatal(err)
    }
}

通过以上步骤,你可以高效地在Golang中遍历MySQL数据。核心在于正确管理连接与资源,并灵活运用Scan方法实现数据映射,结合实际场景选择预处理、分页等策略,可进一步提升代码健壮性与执行效率。

未经允许不得转载! 作者:HTML前端知识网,转载或复制请以超链接形式并注明出处HTML前端知识网

原文地址:https://www.html4.cn/8354.html发布于:2026-08-02