Выполнение SQL-запросов, которые не возвращают данные
При выполнении действий с базой данных, которые не возвращают данные, следует использовать методы Exec или ExecContext из пакета database/sql. SQL-запросы, которые выполняются таким образом, включают INSERT, DELETE и UPDATE.
Если ваш запрос может вернуть строки, используйте методы Query или QueryContext. Подробнее см. в разделе Запрос к базе данных.
Метод ExecContext работает так же, как и метод Exec, но с дополнительным аргументом context.Context, как описано в разделе Отмена выполняющихся операций.
В следующем примере кода используется DB.Exec для выполнения запроса, добавляющего новую запись в таблицу album.
<code>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 новой записи для клиента.
id, err := result.LastInsertId()
if err != nil {
return 0, fmt.Errorf("AddAlbum: %v", err)
}
// Возвращаем ID новой записи.
return id, nil
}
</code>
DB.Exec возвращает значения: sql.Result и ошибку. Если ошибка равна nil, можно использовать Result для получения ID последней вставленной записи (как в примере) или для получения количества строк, затронутых операцией.
Примечание: Заполнители параметров в подготовленных запросах зависят от используемой СУБД и драйвера. Например, драйвер pq для Postgres требует заполнитель вида $1 вместо ?.
Если ваш код будет многократно выполнять один и тот же SQL-запрос, рассмотрите возможность использования sql.Stmt для создания повторно используемого подготовленного запроса из SQL-выражения. Подробнее см. в разделе Использование подготовленных запросов.
Осторожно: Не используйте функции форматирования строк, такие как fmt.Sprintf, для построения SQL-запроса! Это может привести к уязвимости SQL-инъекций. Подробнее см. в разделе Избегание риска SQL-инъекций.
Функции для выполнения SQL-запросов, которые не возвращают строки
| Функция | Описание |
|---|---|
DB.ExecDB.ExecContext
|
Выполняет один SQL-запрос в изоляции. |
Tx.ExecTx.ExecContext
|
Выполняет SQL-запрос внутри более крупной транзакции. Подробнее см. Выполнение транзакций. |
Stmt.ExecStmt.ExecContext
|
Выполняет уже подготовленный SQL-запрос. Подробнее см. Использование подготовленных запросов. |
Conn.ExecContext
|
Используется с зарезервированными соединениями. Подробнее см. Управление соединениями. |