在Golang中重用或复制* sql.Rows

时间:2017-07-03 07:01:51

标签: sql database pointers go copy

在调用*sql.Rows后是否可以重用相同的*sql.Rows.Next(),以便将其传递给另一个函数?

rows, err := db.Query(...)
for rows.Next() {
    // rows.Scan()
}
anotherFunction(rows) // NOT WORKING: This rows became empty.

我尝试制作*sql.Rows的另一个副本,但它不起作用。

rows, err := db.Query(...)
anotherRows := *rows
// PANIC: call of load copies lock value: database/sql.Rows contains sync.RWMutex

1 个答案:

答案 0 :(得分:1)

database/sql软件包在您阅读它们之后,不会为rewind行提供任何方法,即它只是一个"仅向前"结果集。

此外,它将保持与其中的基础(物理)数据库连接的链接,这使得复制或传递它成为一个坏主意。

如果您需要对数据应用多个函数,只需要Scan所有行,以获取一片数据对象,然后传递它。

扫描将复制您读取的数据:

  

扫描将匹配行中的列复制到dest指向的值。

这样您就可以安全地Close您的Rows对象(释放任何相关的数据库资源)。

在执行查询(err)之后和读取行之后,您应该注意错误,通过rows.Err()