在调用*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
答案 0 :(得分:1)
database/sql
软件包在您阅读它们之后,不会为rewind
行提供任何方法,即它只是一个"仅向前"结果集。
此外,它将保持与其中的基础(物理)数据库连接的链接,这使得复制或传递它成为一个坏主意。
如果您需要对数据应用多个函数,只需要Scan
所有行,以获取一片数据对象,然后传递它。
扫描将复制您读取的数据:
扫描将匹配行中的列复制到dest指向的值。
这样您就可以安全地Close
您的Rows
对象(释放任何相关的数据库资源)。
在执行查询(err
)之后和读取行之后,您应该注意错误,通过rows.Err()
。