Ответ
Экранирование в SQL-запросах необходимо для предотвращения SQL-инъекций. В Go есть несколько подходов:
- Плейсхолдеры (
?или$n):
db.Exec("INSERT INTO users(name) VALUES(?)", userName)
Драйвер БД автоматически экранирует значения.
- Named параметры (в
sqlx):
db.NamedExec("INSERT INTO users(name) VALUES(:name)", map[string]interface{}{"name": userName})
- Ручное экранирование (не рекомендуется):
safeName := db.QuoteIdentifier(userName)
Особенности:
- Экранирование зависит от СУБД (MySQL, PostgreSQL и т.д.)
- Плейсхолдеры работают только для значений, не для идентификаторов таблиц/столбцов
- Для динамических имен таблиц используйте
QuoteIdentifierили шаблоны с валидацией