Почему данные не записываются в базу данных SQLite?

Как новичок в Python, я пишу бота для Telegram и сталкиваюсь с проблемой: мне нужно получить данные от пользователя. Программа не выдает ошибок, но информация не сохраняется. <br/> <br/> Мой код: <br/> @start_router.message(Form.name) <br/> async def add_name(message: types.Message): <br/> user_name = message.text.strip() <br/> async with aiosqlite.connect('base.db') as db: <br/> await db.execute('INSERT OR IGNORE INTO user (name) VALUES("%s")' % (user_name)) <br/> await db.commit() <br/> await message.answer("Готово")
  • 5 января 2025 г. 10:23
Ответы на вопрос 2
Судя по вашему коду, проблема может возникать по нескольким причинам. Давайте рассмотрим ваши строки кода и возможные проблемы шаг за шагом:

1. **SQL запрос**:
   ```
   await db.execute('INSERT OR IGNORE INTO user (name) VALUES("%s")' % (user_name))
   ```
   Здесь вы используете строковую интерполяцию для формирования SQL-запроса, что может быть небезопасным и привести к SQL-инъекциям. Вместо этого используйте параметры запроса. Например:
   ```python
   await db.execute('INSERT OR IGNORE INTO user (name) VALUES(?)', (user_name,))
   ```

2. **Отсутствие вызова `await db.commit()`**:
   Ваша строка `await db.commit()` не будет работать, если вы случайно вызовете `commit` не на том объекте. Правильный способ:
   ```python
   await db.commit()  # Вызываем commit на объекте базы данных
   ```

3. **Контекстный менеджер `async with`**:
   Когда вы используете `async with`, база данных автоматически закрывается после выхода из блока, и `commit` может не получить возможность завершиться. Чтобы это исправить, следует выполнить `commit` перед выходом из контекста:
   ```python
   async with aiosqlite.connect('base.db') as db:
       await db.execute('INSERT OR IGNORE INTO user (name) VALUES(?)', (user_name,))
       await db.commit()  # Здесь commit должен работать корректно
   ```

4. **Проверка таблицы и данных**:
   Убедитесь, что:
   - Таблица `user` существует в базе данных и имеет колонку `name`.
   - Строка не пустая и не содержит символов, которые могут быть интерпретированы базой данных неправильно.

5. **Логирование и отладка**:
   Попробуйте добавить логирование, чтобы убедиться, что данные действительно приходят в функцию:
   ```python
   @start_router.message(Form.name)
   async def add_name(message: types.Message):
       user_name = message.text.strip()
       print(f"Received name: {user_name}")  # Логируем имя
       async with aiosqlite.connect('base.db') as db:
           await db.execute('INSERT OR IGNORE INTO user (name) VALUES(?)', (user_name,))
           await db.commit()
       await message.answer("Готово")
   ```

Проверьте эти пункты, и, если проблема не исчезнет, пришлите дополнительные сведения, такие как структуру таблицы и любые дополнительные ошибки или предупреждения, которые вы могли заметить.
А если так попробовать? 
@dp.message_handler(state=Form.name)
async def add_name(message: types.Message):
    user_name = message.text.strip()
    try:
        async with aiosqlite.connect('base.db') as db:
            await db.execute('INSERT OR IGNORE INTO user (name) VALUES (?)', (user_name,))
            await db.commit()
        await message.answer("Готово")
    except Exception as e:
        await message.answer(f"Произошла ошибка {e}")
Похожие вопросы