作者热门文章
- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我需要多次循环返回的 sql.Rows
。我只有两个选择:
换句话说,在 sql.Rows
中无法返回(即 Rows.Next
的对面)。
最佳答案
另一种解决方案是使用装饰器模式:
// A RowsDecorator wraps sql.Rows and allows a callback to be called whenever Scan is called
type RowsDecorator struct {
*sql.Rows
OnScan func([]interface{}, error)
}
func Wrap(rows *sql.Rows, onScan func([]interface{}, error)) *RowsDecorator {
return &RowsDecorator{Rows: rows, OnScan: onScan}
}
// Scan calls Rows.Scan and an optional callback
func (rows *RowsDecorator) Scan(dest ...interface{}) error {
err := rows.Rows.Scan(dest...)
if rows.OnScan != nil {
rows.OnScan(dest, err)
}
return err
}
这样使用:
db.Exec(`CREATE TABLE example (id INTEGER, txt TEXT)`)
db.Exec(`INSERT INTO example (id, txt) VALUES (1, 'test-1'), (2, 'test-2'), (3, 'test-3') `)
rawrows, err := db.Query("SELECT id, txt FROM example")
if err != nil {
log.Fatal(err)
}
defer rawrows.Close()
sum := 0
rows := Wrap(rawrows, func(dest []interface{}, err error) {
if err == nil {
sum += *dest[0].(*int)
}
})
for rows.Next() {
var id int
var txt string
err := rows.Scan(&id, &txt)
if err != nil {
log.Fatal(err)
}
log.Println(id, txt)
}
log.Println("sum", sum)
使用此模式,您可以编写一个自定义函数,在迭代集合时调用该函数。通过使用未命名的嵌入式类型,仍然可以调用所有原始方法(Next、Close 等)。
关于go - 循环遍历数据库/sql sql.Rows 多次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50046151/
我是一名优秀的程序员,十分优秀!