ChatGPT абсолютно прав. Использование параметров вместо конкатенации строк – это правильный способ выполнения SQL-запросов в Python с использованием библиотеки sqlite3. Давайте разберем, почему это важно и как сделать всё корректно.
Проблема с вашим подходом
Когда вы выполняете запрос следующим образом:
cursor.execute('INSERT INTO Users(id, steamname) VALUES(' + str(id) + ', ' + steamname + ')')
вы формируете строку запроса, объединяя значения переменных id и steamname. Если значение переменной steamname содержит пробелы или другие специальные символы, это может привести к ошибкам синтаксического анализа SQL-запроса. Кроме того, такой метод делает приложение уязвимым для атак типа SQL-инъекции, когда злоумышленник может вставить вредоносный код в строку запроса.
Правильный способ
Правильным способом выполнения запросов является использование параметризованных запросов, как предложил ChatGPT:
cursor.execute('INSERT INTO Users(id, steamname) VALUES(?, ?)', (id, steamname))
Здесь вместо значений переменных используется специальный символ ?, который обозначает параметры. Значения этих параметров передаются во втором аргументе метода execute() в виде кортежа (id, steamname).
Преимущества использования параметризованных запросов:
Безопасность: SQLite автоматически экранирует спецсимволы, предотвращая SQL-инъекцию.
Чистота кода: Нет необходимости вручную преобразовывать типы данных и добавлять кавычки вокруг строковых значений.
Производительность: При многократных вставках можно повторно использовать подготовленный запрос, что ускоряет выполнение.
Пример полного кода
Пример полной реализации добавления данных в таблицу Users:
import sqlite3
# Соединяемся с базой данных
conn = sqlite3.connect('example.db')
cursor = conn.cursor()
# Создаем таблицу Users, если ее еще нет
cursor.execute(''' CREATE TABLE IF NOT EXISTS Users ( id INTEGER PRIMARY KEY, steamname TEXT NOT NULL ) ''')
# Данные для вставки
id = 12345
steamname = 'PlayerName'
# Выполняем параметризированный запрос
cursor.execute('INSERT INTO Users(id, steamname) VALUES(?, ?)', (id, steamname))
# Сохраняем изменения
conn.commit()
# Закрываем соединение
conn.close()
Этот пример демонстрирует создание таблицы Users, добавление записи с параметрами id и steamname, а также сохранение изменений в базе данных.
Используя параметризацию запросов, вы избегаете ошибок и делаете свой код более безопасным и надежным.
Я это сделал так:
И потом SQLite выдаёт ошибку нет такого столбца с именем которое является значением из steamname
ChatGPT сказал что так делать нельзя и правильно вот так:
И этот код сработал на ура
почему нельзя делать как я?