Когда вы выполняете действия с базой данных, которые не возвращают данные, используйте метод 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 - Для использования с зарезервированными соединениями.
Читайте также:
- Доступ к реляционной базе данных c Golang
- Работа с реляционными базами данных с Golang
- Открытие дескриптора базы данных с Golang
Комментариев нет:
Отправить комментарий