我想使用Go为广泛使用空值的现有数据库创建API。 Go不会将空值扫描为空字符串(或等效字符串),因此我需要实现一种解决方法。
我发现的变通方法让我不满意。事实上,由于这个问题我去找动态语言,但Go有一定的吸引力,如果可能的话我想坚持下去。以下是不满足的解决方法:
创建我自己的帮助程序包,将所有空字符串转换为"",将null ints转换为0,将null浮点数转换为0.00,将null bools转换为false等,并使其成为进程的一部分从sql驱动程序扫描,导致常规,正常字符串,整数,浮点数和bool。
不幸的是,如果6是解决方案,我没有专业知识。我怀疑解决方案会涉及类似"如果要扫描的项目的预期类型是字符串,请将其设为sql.NullString并从中提取空字符串。但是如果要扫描的项目是int,则将其设置为NullInt64并从中获取零。但是如果......(等)"
我有什么遗漏的吗?谢谢。
答案 0 :(得分:2)
使用sql扫描目标变量的指针可以扫描数据,使用(检查是否!= nil)并编组到json,从API发送, 必须到处放置数百个sql.Nullstring,sql.Nullfloat64等。 Nulls奇迹般地保存下来并通过编组的json发送出去。 (参见底部的父名)。另一方面,客户端可以使用javascript中的空值来处理它们。
func queryToJson(db *sql.DB) []byte {
rows, err := db.Query(
"select mothername, fathername, surname from fams" +
"where surname = ?", "Nullfather"
)
defer rows.Close()
type record struct {
Mname, Fname, Surname *string // the key: use pointers
}
records := []record{}
for rows.Next() {
var r record
err := rows.Scan(r.Mname, r.Fname, r.Surname) // no need for "&"
if err != nil {
log.Fatal(err)
}
fmt.Println(r)
records = append(records, r)
}
j, err := json.Marshal(records)
if err != nil {
log.Fatal(err)
}
return j
}
j := queryToJson(db)
fmt.Println(string(j)) // [{"Mothername":"Mary", "Fathername":null, "Surname":"Nullfather"}]