Когда вы указываете
'{$1}'
постгрес воспринимает это как просто строку, а не как параметр для вставки.
Пробовал явно указывать тип $1
query := `
UPDATE type
SET characteristics = jsonb_insert(
characteristics, '{$1}'::text, '{"type": "$2", "measure": "$3"}'::jsonb
)
WHERE id=$4`
Так тоже ошибка : function jsonb_insert(jsonb, text, jsonb) does not exist
У функции jsonb_insert сигнатура
jsonb_insert(target jsonb, path text[], new_value jsonb [, insert_after boolean])
Поэтому строка `'{$1}'::text'`, должна быть `'{$1}'::text[]'`. (Но и это не совсем поможет)
Можно преобразовать это следующим образом:
query := `
UPDATE type
SET characteristics = jsonb_insert(
characteristics, array[$1::text],
jsonb_build_object('type', $2, 'measure', '$3')
)
WHERE id=$4`
tag, err := conn.Exec(ctx, query,
c.Name, // string
c.Type, // string
c.Measure, // string
c.ID, // uint64
)
Или позволить pxg самому собрать jsonb:
query := `
UPDATE type
SET characteristics = jsonb_insert(
characteristics, array[$1::text], $2
)
WHERE id=$3`
tag, err := conn.Exec(ctx, query,
c.Name, // string
struct{ // лучше вынести как отдельный тип
Type string `json:"type"`
Measure string `json:"measure"`
}{c.Type, c.Measure}
c.ID, // uint64
)