sql - 在 go 中结合 row.Scan 和 rows.Scan 接口(interface)?

标签 sql go

我对 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

最佳答案

db.QueryRow 是一个方便的函数。没有理由使用它,除非它可以节省打字/代码复杂性。在这种情况下,情况并非如此,所以我建议您只使用 db.Query。

参见http://golang.org/src/pkg/database/sql/sql.go?s=25740:25802#L966了解更多详情


正如您所提到的,Row 和 Rows 都没有实现 Scanner 接口(interface)。 Scanner 用于变量扫描函数的参数。

如果你想要一个允许Row或Rows的参数,你需要制作自己的接口(interface)例如:

func serializeFoo(scanner interface{Scan(dest ...interface{}) error}) (*Foo, error) {

}

关于sql - 在 go 中结合 row.Scan 和 rows.Scan 接口(interface)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21095630/

相关文章:

go - En/Decode 结构包含许多具有不同实现的接口(interface),每个接口(interface)都带有 gob

mysql - 根据两列选择行并根据第三列排序

mysql - 如何将关键字与SQL查询匹配?

sql - 我可以使用语音识别编写 SQL 吗?

SQL Server 查看主键

google-app-engine - AppEngine,数据存储 : Preallocating normally-distributed IDs (*not* monotonically incrementing)

curl - Golang HTTP GET 请求返回 404

docker golang API ContainerList 因 TLS 而失败

mysql - 非典型 Mysql Query 的执行顺序

google-app-engine - Google Cloud Datastore Go Client默认不会关闭连接吗?