我对 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.
相关分类