Эффективное создание SQL-запросов в Go
Объединение строк со значениями в текстовых SQL-запросах в Go может быть немного сложной задачей. В отличие от Python, синтаксис форматирования строк в Go ведет себя иначе, что приводит к распространенным ошибкам, подобным той, что встречается здесь.
Ошибка синтаксиса кортежа
Исходный фрагмент кода пытается использовать Python Кортеж в стиле, который не поддерживается в Go. Это приводит к синтаксической ошибке:
query := fmt.Sprintf(`SELECT column_name FROM table_name
WHERE column1_name = %d AND column2_name = %d`,
(val1, val2))
Несовпадающие типы
Попытка привести элементы кортежа в виде строк также завершается неудачно из-за несоответствия типов:
query := fmt.Sprintf(`SELECT column_name FROM table_name
WHERE column1_name = %d AND column2_name = %d`,
val1, val2)
Избегать несоответствия операторов
Приведение параметров в виде строк и их объединение с помощью оператора %s будет работать, но не рекомендуется. Такой подход создает риск несоответствия операторов:
query := fmt.Sprintf(`SELECT column_name FROM table_name
WHERE column1_name = %s AND column2_name = %s`,
strconv.Itoa(val1), val2)
Решение Go
Чтобы правильно написать текстовый SQL-запрос с конкатенацией значений в Go, используйте fmt.Sprintf следующим образом:
query := fmt.Sprintf(`SELECT column_name FROM table_name
WHERE column1_name = %d AND column2_name = %s`,
val1, val2)
Этот синтаксис позволяет избежать уязвимостей внедрения и обеспечивает правильное преобразование типов.
Предотвращение внедрения
Чтобы предотвратить атаки SQL-инъекцией, всегда используйте подготовленные операторы или укажите escape-символы для вводимых пользователем данных.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3