如果我嘗試執行以下操作,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 []byteam, _ := 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{} = nilif c.AccessMembers != nil { j, _ := json.Marshal(c.AccessMembers) accessMembers = j}感謝 thwd 基本上提供了解決方案,并指出了數據庫驅動程序如何以不同的方式編組 nil,建議使用 interface{} 而不是 []byte。感謝DonSeba提醒我在使用資源編組之前檢查struct字段是否存在,進行字符串轉換和比較,這應該更昂貴。
2 回答

慕哥9229398
TA貢獻1877條經驗 獲得超6個贊
我不明白為什么這與在 Exec 函數參數中顯式寫入 nil 不同,因為 []byte 顯然必須為零,對嗎?
nil有一個類型。數據庫驅動程序nil對 typemap[string]interface{}或[]bytefor interface{} (這是 的第二個參數的類型)的封送方式不同db.Exec。你應該能夠做到:
var i interface{} = nil
j, _ := json.Marshal(c.AccessMembers)
if string(j) != "null" {
i = j
}
sqlStr := `UPDATE content SET access_members=$1 WHERE id=$2;`
_, err := db.Exec(sqlStr, i, c.Id)
- 2 回答
- 0 關注
- 266 瀏覽
添加回答
舉報
0/150
提交
取消