感觉 Go 文档 中的例子好像不完整,函数参数中的 context 是哪来的?直接用默认的那个上下文就行?另外好像还需要处理 context 的错误?文档里好像没有。网上搜了一会儿,也看了一会儿,失去耐心了。
所谓靠谱就是最好是官方文档中的代码。我怀疑我搜索的方法不对,可能有完整的例子。如果确实没有的话,经验丰富的大佬给段代码也行。或者大型开源项目中的代码段也行,我自己试着在 github 上搜了一下,搜索代码的时候好像不能按照项目的收藏数排序。
感觉 Go 文档 中的例子好像不完整,函数参数中的 context 是哪来的?直接用默认的那个上下文就行?另外好像还需要处理 context 的错误?文档里好像没有。网上搜了一会儿,也看了一会儿,失去耐心了。
所谓靠谱就是最好是官方文档中的代码。我怀疑我搜索的方法不对,可能有完整的例子。如果确实没有的话,经验丰富的大佬给段代码也行。或者大型开源项目中的代码段也行,我自己试着在 github 上搜了一下,搜索代码的时候好像不能按照项目的收藏数排序。
package main
import (
"context"
"database/sql"
"fmt"
"log"
"time"
_ "github.com/go-sql-driver/mysql"
)
func main() {
// 替换为你的 MySQL 数据源名称 (DSN)
dsn := "user:password@tcp(127.0.0.1:3306)/dbname"
// 打开数据库连接
db, err := sql.Open("mysql", dsn)
if err != nil {
log.Fatalf("Failed to connect to database: %v", err)
}
defer db.Close()
// 设置查询的上下文,带超时
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) // 超时时间为 5 秒
defer cancel()
// 执行带上下文的查询
query := "SELECT id, name FROM users WHERE status = ?"
rows, err := db.QueryContext(ctx, query, 1)
if err != nil {
if ctx.Err() == context.DeadlineExceeded {
log.Fatalf("Query timed out: %v", err)
} else {
log.Fatalf("Database error: %v", err)
}
}
defer rows.Close()
// 处理结果
for rows.Next() {
var id int
var name string
if err := rows.Scan(&id, &name); err != nil {
log.Fatalf("Scan error: %v", err)
}
fmt.Printf("ID: %d, Name: %s\n", id, name)
}
if err := rows.Err(); err != nil {
log.Fatalf("Error iterating rows: %v", err)
}
}
2 回答1.3k 阅读
2 回答1.1k 阅读
2 回答1.1k 阅读
2 回答859 阅读
3 回答677 阅读
999 阅读
1 回答780 阅读
数据库连接
使用环境变量加载 DSN(数据源名称):
安装 MySQL 驱动
确定安装 MySQL 驱动:
测试数据库准备
确定数据库和表存在,例如
users
表结构: