dtkvlj5386 2018-04-26 14:54
浏览 104
已采纳

遍历数据库/ sql sql.rows多次?

I need to loop through returned sql.Rows multiple times. Are my only two options:

  1. to cache the returned results in a local data structure;
  2. redo the database query?

In other words, there is no way to go back in sql.Rows (i.e., opposite of Rows.Next).

  • 写回答

1条回答 默认 最新

  • doudengshen5591 2018-04-27 02:38
    关注

    Another solution would be to use the decorator pattern:

    // 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
    }
    

    Used like this:

    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)
    

    With this pattern you can write a custom function that is called as you iterate over the collection. By using an unnamed, embedded type all of the original methods (Next, Close, etc) can still be called.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 关于#python#的问题:求帮写python代码
  • ¥20 MATLAB画图图形出现上下震荡的线条
  • ¥15 LiBeAs的带隙等于0.997eV,计算阴离子的N和P
  • ¥15 关于#windows#的问题:怎么用WIN 11系统的电脑 克隆WIN NT3.51-4.0系统的硬盘
  • ¥15 来真人,不要ai!matlab有关常微分方程的问题求解决,
  • ¥15 perl MISA分析p3_in脚本出错
  • ¥15 k8s部署jupyterlab,jupyterlab保存不了文件
  • ¥15 ubuntu虚拟机打包apk错误
  • ¥199 rust编程架构设计的方案 有偿
  • ¥15 回答4f系统的像差计算