Updating Jsonb column in golang

huangapple go评论113阅读模式
英文:

Updating Jsonb column in golang

问题

我正在尝试更新特定行的Jsonb列值。
我运行了以下查询:

  1. UPDATE instruction.file SET "details" = (jsonb_set("details",'{\"UploadBy\"}','\"test@test.com\"'::jsonb, true)) WHERE id=820;

这在pgAdmin3中运行正常。

当我尝试在我的Go代码中执行相同的操作时,我遇到了错误:"pq: invalid input syntax for type json"。

我的Go代码如下:

  1. func main() {
  2. uname := "test@test.com"
  3. err := Init() //Db init
  4. if err != nil {
  5. fmt.Println("Error", err)
  6. return
  7. }
  8. result, err1 := Db.Exec("UPDATE instruction.file SET \"details\" = (jsonb_set(\"details\",'{\"UploadBy\"}', $1::jsonb, true)) WHERE id=$2", uname, "820")
  9. if err1 != nil {
  10. fmt.Println("Error", err1)
  11. return
  12. }
  13. n, err1 := result.RowsAffected()
  14. if err1 != nil {
  15. fmt.Println("Error", err1)
  16. return
  17. }
  18. if n != 1 {
  19. err1 = errors.New("Unable to update instruction.file")
  20. fmt.Println("Error", err1)
  21. return
  22. }
  23. fmt.Println("Success")
  24. return
  25. }
英文:

I am trying to update a Jsonb column value for a particular row.
I ran the query

  1. UPDATE instruction.file SET "details" = (jsonb_set("details",'{"UploadBy"}','"test@test.com"'::jsonb, true)) WHERE id=820;

this works fine in the pgAdmin3.

When I tried to do the same in my Go code. Iam getting the error:"pq: invalid input syntax for type json"

My Go code:

  1. func main() {
  2. uname := "test@test.com"
  3. err := Init() //Db init
  4. if err != nil {
  5. fmt.Println("Error", err)
  6. return
  7. }
  8. result, err1 := Db.Exec("UPDATE instruction.file SET \"details\" = (jsonb_set(\"details\",'{\"UploadBy\"}',$1::jsonb, true)) WHERE id=$2", uname, "820")
  9. if err1 != nil {
  10. fmt.Println("Error", err1)
  11. return
  12. }
  13. n, err1 := result.RowsAffected()
  14. if err1 != nil {
  15. fmt.Println("Error", err1)
  16. return
  17. }
  18. if n != 1 {
  19. err1 = errors.New("Unable to update instruction.file")
  20. fmt.Println("Error", err1)
  21. return
  22. }
  23. fmt.Println("Success")
  24. return
  25. }

答案1

得分: 7

使用to_jsonb函数:

  1. Db.Exec(`
  2. UPDATE instruction.file
  3. SET details = jsonb_set("details", '{"UploadBy"}', to_jsonb($1::text), true)
  4. WHERE id = $2
  5. `, uname, "820"
  6. )
英文:

Use to_jsonb:

  1. Db.Exec(`
  2. UPDATE instruction.file
  3. SET details = jsonb_set("details", '{"UploadBy"}', to_jsonb($1::text), true)
  4. WHERE id = $2
  5. `, uname, "820"
  6. )

答案2

得分: 0

我成功解决了错误:

当创建时,"uname" 的类型是字符串,像这样:

  1. uname := "test@test.com"

它应该是一个 JSON 变量。必须像这样创建:

  1. uname := `"test@test.com"`

我不知道这是否是正确的答案,但它有效。

英文:

I managed to remove the error:

"uname" was of the type string, when created like:

  1. uname := "test@test.com"

It should be a json variable. Must be created like:

  1. uname := `"test@test.com"`

I don't know whether it is the right answer. But it works.

huangapple
  • 本文由 发表于 2017年2月21日 15:45:36
  • 转载请务必保留本文链接:https://go.coder-hub.com/42361418.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定