Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

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

ALEX MI Ученик (83), закрыт 21 час назад
Моя задача: Добавить в столбец id и столбец steamname данные из переменных id и steamname.
Я это сделал так:
 cursor.execute('INSERT INTO Users(id, steamname) VALUES(' + str(id) + ', ' + steamname + ')')  

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

ChatGPT сказал что так делать нельзя и правильно вот так:
 cursor.execute('INSERT INTO Users(id, steamname) VALUES(?, ?)', (id, steamname))  

И этот код сработал на ура
почему нельзя делать как я?
Лучший ответ
Ярослав Иванов Профи (532) 4 дня назад
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, а также сохранение изменений в базе данных.

Используя параметризацию запросов, вы избегаете ошибок и делаете свой код более безопасным и надежным.
Остальные ответы
Александр Искусственный Интеллект (301506) 3 дня назад
попроси чат жпт показать тебе как реализован метод cursor.execut(...) или сам почитай документацию о том что можно передавать в этот конкретный метод...
Похожие вопросы