Как обновить postgres JSONB с переменными параметрами в golang? - PullRequest
0 голосов
/ 06 февраля 2020

У меня есть таблица в cockroachdb / postgres, как показано ниже:

  column_name | data_type | is_nullable | column_default | generation_expression |  indices  | is_hidden  
+-------------+-----------+-------------+----------------+--------------------+-----------+-----------+
  id         | STRING    |    false    | NULL           |                       | {primary} |   false    
  student    | JSONB     |    true     | NULL           |                       | {}        |   false    
(2 rows)


     id    |                                     student                                      
+--------------------+----------------------------------------------+
  1        | {"name": "Albert"}                                                                    
  2        | {"name": "Bob", "state": "CA"}

Я пытаюсь обновить student с переменным количеством параметров - например, иногда обновлять age, некоторые время обновления age и country et c. Как нам это сделать в golang?

Вот что у меня пока есть, но оно не работает.

package main

import (
    "database/sql"
    "fmt"
    _ "github.com/lib/pq"
)

var (
    DB        = "testdb"
    DBUSER    = "testuser"
    TESTTABLE = "ttab"
    CONNSTR   = "dbname=" + DB + " user=" + DBUSER + " host=localhost port=26257 sslmode=disable"
    DBDRIVER  = "postgres"
)
var (
    NAME    = "name"
    AGE     = "age"
    STATE   = "state"
    COUNTRY = "country"
)

func update(si map[string]string, id string) error {

    silen := len(si)
    if silen == 0 {
        return fmt.Errorf("si cannot be empty")
    }

    keys := []string{}
    values := []string{}
    for k, v := range si {
        keys = append(keys, k)
        values = append(values, v)
    }

    db, err := sql.Open(DBDRIVER, CONNSTR)
    if err != nil {
        return err
    }

    defer db.Close()

    sqlCmd := "UPDATE " + TESTTABLE + " SET student = student || jsonb_object($1, $2) WHERE id = $3"
    _, err := db.Exec(sqlCmd, keys, values, id)
    return err
}

func main() {

    s := make(map[string]string)
    s[AGE] = "22"
    s[COUNTRY] = "USA"
    if err := updateFast3DB(s3, "1"); err != nil {
        fmt.Printf("err: %v\n", err)
    }
}

Ошибка:

[root@bin] # ./updatedb ошибка обновления: sql: преобразование аргумента $ 1 тип: неподдерживаемый тип [] строка, фрагмент строки [root@bin] #

...