如果我尝试执行以下操作,Go 会在我的 PostgreSQL 数据库的 jsonb 列中插入“null”,并且 structs 属性(在这种情况下为 map[string]interface{} 类型)为空,则出现问题:
accessMembers, _ := json.Marshal(c.AccessMembers)
进行测试打印它输出的值与存储到数据库中的值相同:
fmt.Println(string(accessMembers)) // equals the string "null"
问题是我需要它是 - nil(不是字符串,而是 Golang nil),所以当我在下面的 Exec 函数中使用它时:
sqlStr := `UPDATE my_table SET access_members=$1 WHERE id=$2;`
_, err := db.Exec(sqlStr, accessMembers, c.Id)
它应该等效于(有效!!):
_, err := db.Exec(sqlStr, nil, c.Id)
我尝试了很多不同的解决方法,我认为这些方法必须有效,但它们没有。
例如。
var accessMembers []byte
am, _ := json.Marshal(c.AccessMembers)
if string(am) != "null"{
accessMembers = am
}
sqlStr := `UPDATE my_table SET access_members=$1 WHERE id=$2;`
_, err := db.Exec(sqlStr, accessMembers, c.Id)
这会导致以下错误:“pq:json 类型的输入语法无效”
我不明白为什么这与在 Exec 函数参数中显式写入 nil 不同,因为 []byte 显然必须为零,对吗?
我在这里做错了什么?这是我希望它会起作用的方式:http : //play.golang.org/p/UoLAGfhhRl
回答:
var accessMembers interface{} = nil
if c.AccessMembers != nil {
j, _ := json.Marshal(c.AccessMembers)
accessMembers = j
}
感谢 thwd 基本上提供了解决方案,并指出了数据库驱动程序如何以不同的方式编组 nil,建议使用 interface{} 而不是 []byte。
感谢DonSeba提醒我在使用资源编组之前检查struct字段是否存在,进行字符串转换和比较,这应该更昂贵。
慕哥9229398
相关分类