У меня есть таблица в 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] #