четверг, 2 сентября 2021 г.

Выполнение операторов SQL, которые не возвращают данные, с пакетом database/sql в Golang

Когда вы выполняете действия с базой данных, которые не возвращают данные, используйте метод Exec или ExecContext из пакета database/sql. Операторы SQL, которые вы выполняете таким образом, включают INSERT, DELETE и UPDATE.

Если ваш запрос может возвращать строки, используйте вместо этого метод Query или QueryContext.

Метод ExecContext работает так же, как метод Exec, но с дополнительным аргументом context.Context.

Код в следующем примере использует DB.Exec для выполнения инструкции по добавлению нового альбома в таблицу album.

func AddAlbum(alb Album) (int64, error) {
    result, err := db.Exec("INSERT INTO album (title, artist) VALUES (?, ?)", alb.Title, alb.Artist)
    if err != nil {
        return 0, fmt.Errorf("AddAlbum: %v", err)
    }

    // Получить сгенерированный идентификатор нового альбома для клиента.
    id, err := result.LastInsertId()
    if err != nil {
        return 0, fmt.Errorf("AddAlbum: %v", err)
    }
    // Возвращаем ID нового альбома.
    return id, nil
}

DB.Exec возвращает значения: sql.Result и ошибку. Когда ошибка равна nil, вы можете использовать Result для получения идентификатора последнего вставленного элемента (как в примере) или для получения количества строк, затронутых операцией.

Примечание. Заполнители параметров в подготовленных операторах различаются в зависимости от СУБД и драйвера, который вы используете. Например, драйвер pq для Postgres требует заполнителя типа $1 вместо ?.

Если ваш код будет многократно выполнять один и тот же оператор SQL, рассмотрите возможность использования sql.Stmt для создания повторно используемого подготовленного оператора из оператора SQL.

Внимание: не используйте функции форматирования строк, такие как fmt.Sprintf, для сборки оператора SQL! Вы можете создать риск внедрения SQL-кода (SQL-injection).

Функции для выполнения операторов SQL, которые не возвращают строки

DB.Exec, DB.ExecContext - Выполнение одного оператора SQL изолированно.

Tx.Exec, Tx.ExecContext - Выполнение инструкции SQL в более крупной транзакции.

Stmt.Exec, Stmt.ExecContext - Выполнение уже подготовленного оператора SQL.

Conn.ExecContext - Для использования с зарезервированными соединениями.


Читайте также:


Купить gopher

Комментариев нет:

Отправить комментарий