申祷无 2025-06-05 15:25 采纳率: 40%
浏览 13

求段尽量靠谱的完整的在 Go 中实现 SQL 查询超时的代码?

感觉 Go 文档 中的例子好像不完整,函数参数中的 context 是哪来的?直接用默认的那个上下文就行?另外好像还需要处理 context 的错误?文档里好像没有。网上搜了一会儿,也看了一会儿,失去耐心了。

所谓靠谱就是最好是官方文档中的代码。我怀疑我搜索的方法不对,可能有完整的例子。如果确实没有的话,经验丰富的程序员给段代码也行。或者大型开源项目中的代码段也行,我自己试着在 github 上搜了一下,搜索代码的时候好像不能按照项目的收藏数排序。

  • 写回答

5条回答 默认 最新

  • 阿里嘎多学长 2025-06-05 15:25
    关注

    阿里嘎多学长整理AIGC生成,因移动端显示问题导致当前答案未能完全显示,请使用PC端查看更加详细的解答过程

    解答

    Go 中实现 SQL 查询超时的代码可以使用 database/sql 包中的 QueryContext 方法,它可以在查询过程中设置超时时间。

    下面是一个简单的示例代码:

    package main
    
    import (
    	"database/sql"
    	"fmt"
    	"time"
    )
    
    func main() {
    	// 创建一个数据库连接
    	db, err := sql.Open("mysql", "user:password@tcp(localhost:3306)/database")
    	if err != nil {
    		fmt.Println(err)
    		return
    	}
    	defer db.Close()
    
    	// 设置查询超时时间为 5 秒
    	ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
    	defer cancel()
    
    	// 执行查询
    	rows, err := db.QueryContext(ctx, "SELECT * FROM table_name")
    	if err != nil {
    		fmt.Println(err)
    		return
    	}
    	defer rows.Close()
    
    	// 处理查询结果
    	for rows.Next() {
    		var col1 string
    		var col2 int
    		err = rows.Scan(&col1, &col2)
    		if err != nil {
    			fmt.Println(err)
    			return
    		}
    		fmt.Println(col1, col2)
    	}
    }
    

    在上面的代码中,我们使用 sql.Open 函数创建一个数据库连接,然后使用 QueryContext 方法执行查询。QueryContext 方法的第一个参数是上下文对象 ctx,它可以在查询过程中设置超时时间。第二个参数是查询语句。

    main 函数中,我们使用 context.WithTimeout 函数创建一个超时时间为 5 秒的上下文对象 ctx。然后,我们使用 db.QueryContext 方法执行查询,并将上下文对象 ctx 传递给它。

    如果查询超时,QueryContext 方法将返回一个错误对象 err。我们可以使用 err 对象来处理超时错误。

    需要注意的是,在使用 QueryContext 方法时,需要确保数据库连接是可用的。如果连接不可用,QueryContext 方法将返回一个错误对象 err

    代码解释

    • sql.Open 函数创建一个数据库连接。
    • context.WithTimeout 函数创建一个超时时间为 5 秒的上下文对象 ctx
    • db.QueryContext 方法执行查询,并将上下文对象 ctx 传递给它。
    • QueryContext 方法返回一个结果对象 rows 和一个错误对象 err
    • 我们使用 rows 对象来处理查询结果,并使用 err 对象来处理超时错误。

    代码示例

    上面的代码示例是一个简单的示例代码,用于演示如何使用 QueryContext 方法在 Go 中实现 SQL 查询超时。

    评论

报告相同问题?

问题事件

  • 创建了问题 6月5日