Golang中database/sql查询结果不符合预期怎么办
Golang中database/sql查询结果不符合预期怎么办 大家好, 首先,现在很晚了,我也很累,所以如果发现任何错误,我提前道歉,但我认为一切都没问题…… 我正在使用 database/sql 从我的 Postgres 数据库进行查询。现在所有查询都运行得很好。不过,我其中一个查询会从表中删除一些数据元组。虽然它运行正常,但我希望能够看到有多少行被影响/删除。这应该很简单,对我来说,应该如下面的代码所示:
myResults, err := db.Exec(sqlStatement) // 创建表
if err != nil {
fmt.Println("Info:")
log.Fatal(err)
} else {
fmt.Printf("\ndb.Exec results = %d", myResults)
fmt.Printf("\n%d rows were deleted.", myResults.RowsAffected)
}
当这段代码执行时,我得到以下结果:

正如你在图片中看到的,RowsAffected 没有提供我预期的结果(我不知道它指向的是什么)。你会注意到在前一行(花括号内)括号里显示的是 8。这就是我想要的数字,也是受影响行数的正确值。
我已经阅读了这里提供的信息,其中说明根据你使用的数据库类型,这些值可能不可用。但显然我想要的值是存在的(在提供的例子中,删除的行数 = 8)。 https://golang.org/pkg/database/sql/#Result
我如何从这个 sql.Result 类型的变量中读取那个数字?
更多关于Golang中database/sql查询结果不符合预期怎么办的实战教程也可以访问 https://www.itying.com/category-94-b0.html
RowsAffected() 是一个方法,你需要调用它。6301440 是保存你数据方法的内存地址的十进制表示。
更多关于Golang中database/sql查询结果不符合预期怎么办的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
函数在被调用时可以返回任何内容。是的,即使是函数本身,尽管这里发生的情况并非如此。
这里发生的情况是,一个“函数”或“方法”仅仅是一个指向其第一条指令所在内存区域的指针。
如果你不调用它(即只写函数名而不加括号),那么你将得到它的地址,这就是 6301440 所代表的——函数地址的十进制表示。
// 代码示例(如有)将放在这里
哇,谢谢 @NobbZ,我觉得就算我昨晚不是特别累,也猜不到这一点!学到了新东西,原来函数不仅可以返回值,还可以返回函数/方法。
现在一切正常了,为了给其他人更清楚地说明一下,这里是可运行的 Go 代码。这解决了我之前遇到的以下错误: Printf 格式 %v 的参数 myResults.RowsAffected 是一个函数值,未被调用 go-vet
再次感谢您的帮助。
myResults, err := db.Exec(sqlStatement) // Create table
if err != nil {
fmt.Println("Info:")
log.Fatal(err)
} else {
// myResults returned by earlier function call is an INTERFACE for associated methods, not a value
// To get the value we require, we call the relevant method
delRows, err := myResults.RowsAffected()
if err != nil {
fmt.Println("Error: Failed to read count of affected rows")
log.Fatal(err)
}
fmt.Printf("\n%v rows were deleted", delRows)
}
}
在Golang的database/sql包中,RowsAffected()方法返回的是受影响的行数,但需要正确调用。根据你的代码和描述,问题在于你直接打印了sql.Result对象,而不是调用其方法。以下是修正后的代码示例:
myResults, err := db.Exec(sqlStatement) // 执行删除操作
if err != nil {
log.Fatal(err)
}
rowsAffected, err := myResults.RowsAffected()
if err != nil {
log.Fatal(err)
}
fmt.Printf("%d rows were deleted.\n", rowsAffected)
关键点:
db.Exec()返回的myResults是sql.Result接口类型,不能直接打印其内部值。- 必须通过
RowsAffected()方法获取受影响的行数,该方法返回int64和可能的错误。 - 对于PostgreSQL,
RowsAffected()通常能正确返回受影响的行数,但需要检查错误。
如果你的SQL语句是DELETE操作,rowsAffected将显示实际删除的行数。例如,如果删除了8行,输出将是:
8 rows were deleted.
注意:直接打印myResults会显示底层驱动实现的String()输出,这可能不是预期的行数。始终使用RowsAffected()方法获取准确结果。

