在 go 中结合 row.Scan 和 rows.Scan 接口?

我对 Go 中的特定表有两个查询 - 一个用于检索单个项目,另一个用于返回列表。第一个使用sql.DB.QueryRow是因为它只需要检索一行,第二个用于sql.DB.Query返回几个不同的结果。


问题是序列化需要一些工作,我想通过使用从数据库行扫描并将其读入 Go 类型的单一方法来完成它。我的代码现在看起来像:


// Some type which varies considerably from its DB representation, and takes some effort to serialize.

type Foo struct {

    Baz *Baz

    Board [8][8]int

}


// Get one foo by its id

func GetFoo(id int) {

    row := db.QueryRow("select * from foo where id = ?", id)

    // Work that's duplicated from below...

     var foo Foo

    row.Scan(&foo.blah, &foo.etc)

    // Do more work to serialize the type...

}


// Get all of the fooes

func GetFooes() {

    rows, err := db.Query("select * from foo")

    for rows.Next() {

        // Work that's duplicated from above...

        var foo Foo

        rows.Scan(&foo.blah, &foo.etc)

        // Do more work to serialize the type...

    }

}

然而,事实证明将 row.Scan 和 rows.Scan 结合起来有点棘手。我以为我可以使用类似的东西:


func serializeFoo(scanner sql.Scanner) (*Foo, error) {


}

尽管 sql.Scanner 需要单个(value interface{})而不是(...value interface{}).


这里有什么建议吗?另一种解决方案是将单个QueryRow调用转换为db.Query.


有只小跳蛙
浏览 1265回答 1
1回答
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go