Выполнение 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.Exec
DB.ExecContext
Выполняет один SQL-запрос в изоляции.
Tx.Exec
Tx.ExecContext
Выполняет SQL-запрос внутри более крупной транзакции. Подробнее см. Выполнение транзакций.
Stmt.Exec
Stmt.ExecContext
Выполняет уже подготовленный SQL-запрос. Подробнее см. Использование подготовленных запросов.
Conn.ExecContext Используется с зарезервированными соединениями. Подробнее см. Управление соединениями.
GoRu.dev Golang на русском

На сайте представлена адаптированная под русский язык документация языка программирования Golang