Golang PGX как добавлять значения в jsonb?

В Golang существует несколько способов добавления значений в поле типа JSONB в PostgreSQL с использованием драйвера PGX.

1. Используйте функцию jsonb_set(). Эта функция может использоваться для добавления новых ключей или изменения существующих значений в поле JSONB. Вот пример кода:

import (
    "database/sql"
    "github.com/jackc/pgx/v4"
)

func main() {
    // Подключение к базе данных PostgreSQL
    conn, err := pgx.Connect(context.Background(), "postgresql://user:password@localhost:5432/database")
    if err != nil {
        log.Fatal(err)
    }
    defer conn.Close()

    // Новое значение, которое нужно добавить в поле JSONB
    newValue := `{"key": "value"}`

    // Выполнить SQL-запрос с использованием функции jsonb_set()
    _, err = conn.Exec(context.Background(), `UPDATE my_table SET my_column = jsonb_set(my_column, '{newKey}', $1)`, newValue)
    if err != nil {
        log.Fatal(err)
    }
}

В этом примере мы используем функцию jsonb_set(), чтобы добавить новый ключ 'newKey' со значением '{"key": "value"}' в поле my_column таблицы my_table.

2. Используйте оператор || для конкатенации JSONB-значений. Вот пример кода:

import (
    "database/sql"
    "encoding/json"
    "github.com/jackc/pgx/v4"
)

func main() {
    // Подключение к базе данных PostgreSQL
    conn, err := pgx.Connect(context.Background(), "postgresql://user:password@localhost:5432/database")
    if err != nil {
        log.Fatal(err)
    }
    defer conn.Close()

    // Текущий JSONB-объект из поля базы данных
    currentValue := make(map[string]interface{})
    err = conn.QueryRow(context.Background(), "SELECT my_column FROM my_table WHERE id = $1", 1).Scan(&currentValue)
    if err != nil {
        log.Fatal(err)
    }

    // Новое значение, которое нужно добавить в поле JSONB
    newValue := map[string]interface{}{
        "newKey": "value",
    }

    // Конкатенация JSONB-значений с использованием оператора ||
    newJsonValue, err := json.Marshal(newValue)
    if err != nil {
        log.Fatal(err)
    }

    _, err = conn.Exec(context.Background(), `UPDATE my_table SET my_column = my_column || $1 WHERE id = $2`, newJsonValue, 1)
    if err != nil {
        log.Fatal(err)
    }
}

В этом примере мы сначала получаем текущее значение поля my_column для заданного id. Затем мы создаем новое JSONB-значение и конвертируем его в байтовое представление используя json.Marshal(). Затем мы использовали оператор || для конкатенации старого значения и нового значения. Finally, we execute an SQL statement to update the JSONB field with the new concatenated value.

Both of these methods can be used to add values to a JSONB field in PostgreSQL using the Golang PGX driver. Choose the one that suits your specific requirements and coding style.