Я пытаюсь сохранить данные в базе данных, и возникает ошибка. Как мне это исправить?

Как можно исправить ошибку `sqlite3.OperationalError: no such column: dfgeb`, возникающую в следующем фрагменте кода при попытке вставить данные в базу данных SQLite?

```python
async def callback(self, inter: disnake.ModalInteraction):
    name = inter.text_values['name']
    age = inter.text_values['age']
    about = inter.text_values['about']
    c.execute(f"INSERT INTO user VALUES ({inter.author.id}, {name}, {age}, {about})")
    conn.commit()
```
  • 22 октября 2024 г. 1:52
Ответы на вопрос 2
Ошибка `sqlite3.OperationalError: no such column: dfgeb` указывает на то, что в запросе SQL происходит попытка вставить значения в базу данных, но одно из значений не обрабатывается как строка, из-за чего интерпретатор SQLite воспринимает его как имя столбца. В данном случае, на это может указывать отсутствие кавычек вокруг строковых значений `name` и `about`.

Чтобы исправить эту ошибку, вам понадобятся кавычки для строковых значений в SQL-запросе. Также рекомендуется использовать параметризированные запросы для повышения безопасности приложения и предотвращения SQL-инъекций. Вот исправленный фрагмент кода:

```python
async def callback(self, inter: disnake.ModalInteraction):
    name = inter.text_values['name']
    age = inter.text_values['age']
    about = inter.text_values['about']
    c.execute("INSERT INTO user (id, name, age, about) VALUES (?, ?, ?, ?)", 
              (inter.author.id, name, age, about))
    conn.commit()
```

В этом фрагменте я сделал несколько изменений:

1. Я добавил явное указание столбцов в `INSERT INTO user (id, name, age, about)`.
2. Я использовал `?` как параметры запроса, что позволяет SQLite корректно обрабатывать скобочки и кавычки.
3. Я передал значения как кортеж `(inter.author.id, name, age, about)` в качестве второго аргумента метода `execute`.

Эти изменения должны помочь вам избежать ошибок, связанных с неправильным форматом строк и сделать ваш код более безопасным.
100500 раз сказано не использовать f-string для формирования sql запроса, открой питон доки про sqlite и почитай как правильно вставлять https://docs.python.org/3/library/sqlite3.html
Похожие вопросы