Top.Mail.Ru
Ответы
Аватар пользователя
7мес
Аватар пользователя
Аватар пользователя
Аватар пользователя
Программирование
+3

Вставка данных SQLite из python

Моя задача: Добавить в столбец id и столбец steamname данные из переменных id и steamname.
Я это сделал так:

1
 cursor.execute('INSERT INTO Users(id, steamname) VALUES(' + str(id) + ', ' + steamname + ')')  


И потом SQLite выдаёт ошибку нет такого столбца с именем которое является значением из steamname

ChatGPT сказал что так делать нельзя и правильно вот так:

1
 cursor.execute('INSERT INTO Users(id, steamname) VALUES(?, ?)', (id, steamname))  


И этот код сработал на ура
почему нельзя делать как я?

По дате
По рейтингу
Аватар пользователя
Новичок
7мес

ChatGPT абсолютно прав. Использование параметров вместо конкатенации строк – это правильный способ выполнения SQL-запросов в Python с использованием библиотеки sqlite3. Давайте разберем, почему это важно и как сделать всё корректно.

Проблема с вашим подходом
Когда вы выполняете запрос следующим образом:

1
 cursor.execute('INSERT INTO Users(id, steamname) VALUES(' + str(id) + ', ' + steamname + ')') 

вы формируете строку запроса, объединяя значения переменных id и steamname. Если значение переменной steamname содержит пробелы или другие специальные символы, это может привести к ошибкам синтаксического анализа SQL-запроса. Кроме того, такой метод делает приложение уязвимым для атак типа SQL-инъекции, когда злоумышленник может вставить вредоносный код в строку запроса.

Правильный способ
Правильным способом выполнения запросов является использование параметризованных запросов, как предложил ChatGPT:

1
 cursor.execute('INSERT INTO Users(id, steamname) VALUES(?, ?)', (id, steamname)) 

Здесь вместо значений переменных используется специальный символ ?, который обозначает параметры. Значения этих параметров передаются во втором аргументе метода execute() в виде кортежа (id, steamname).

Преимущества использования параметризованных запросов:

Безопасность: SQLite автоматически экранирует спецсимволы, предотвращая SQL-инъекцию.
Чистота кода: Нет необходимости вручную преобразовывать типы данных и добавлять кавычки вокруг строковых значений.
Производительность: При многократных вставках можно повторно использовать подготовленный запрос, что ускоряет выполнение.
Пример полного кода
Пример полной реализации добавления данных в таблицу Users:

123456789101112131415161718192021
 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, а также сохранение изменений в базе данных.

Используя параметризацию запросов, вы избегаете ошибок и делаете свой код более безопасным и надежным.

Аватар пользователя
Искусственный Интеллект
7мес

попроси чат жпт показать тебе как реализован метод cursor.execut(...) или сам почитай документацию о том что можно передавать в этот конкретный метод...