Задать вопрос
@kafarof

SQLite не хочет добавлять данные, введенные пользователем в тг боте в базу данных, что делать?

Ошибка:
cur.execute(f'INSERT INTO result(name) VALUES ({data["Name"]})')
sqlite3.OperationalError: no such column: ilya

Код:
from aiogram import F, Router
from aiogram.filters import CommandStart, Command
from aiogram.types import Message
from aiogram.fsm.state import  StatesGroup, State
from aiogram.fsm.context import FSMContext
import sqlite3

router = Router()

db = sqlite3.connect('DataBase.db')

cur = db.cursor()

class Reg(StatesGroup):
    Name = State()
    School_class = State()


@router.message(CommandStart())
async def cmd_start(message: Message):
    await message.answer('Привет! Ты попал в телеграм бота по игре про ВОВ. '
                         'Пропиши команду /devtopeople')

@router.message(Command('devtopeople'))
async def help1(message: Message):
    await message.reply('Отлично, перед тем, чтобы начать игру, можешь прочитать информацию про'
                        'создателя и заказчика бота, по команде: /info'
                        'Чтобы начать игру прямо сейчас, команда будет рассказано в команде /help.')

@router.message(Command('help'))
async def help(message: Message):
    await message.answer('Команда для начала: /StartGame')
    await message.answer('Все Ваши данные будут направлены в Базу Данных (Ваш статический TGID и Имя.'
                         'Поэтому рекомендую ставить на время ваше настоящее имя в Телеграм на время'
                         'игры')
    await message.answer('Ваши данные нужны для того, чтобы понимать кто и как ответил. так что можете не беспокоиться. Все данные будут зашифрованы и никто ваши Данные не узнает. ')

@router.message(Command('StartGame'))
async def reg1(message: Message, state: FSMContext):
    await state.set_state(Reg.Name)
    await message.answer('Начинаем! Как тебя зовут?')

@router.message(Reg.Name)
async def reg_2(message: Message, state: FSMContext):
    await state.update_data(Name=message.text)

    Sclass = await state.set_state(Reg.School_class)
    await message.answer('Введите класс')

@router.message(Reg.School_class)
async def reg3(message: Message, state: FSMContext):
    await state.update_data(School_class=message.text)
    data = await  state.get_data()
    cur.execute(f'INSERT INTO result(name) VALUES ({data["Name"]})')
    db.commit()
    cur.execute(f'INSERT INTO result(name) VALUES({data['School_class']})')
    db.commit()
    await message.answer(f'Хорошо! Мы закончили.Ваше имя: {data["Name"]}, Класс: {data["School_class"]} ')
    await state.clear()

@router.message(Command('info'))
async def info(message: Message):
    await message.answer('Создатель бота - kafarof '
                         'Заказчик бота -  '
                         'Цена разработки: за идею')

@router.message(Command('test'))
async def test(message: Message):
        await message.reply(reply_markup=kb.main)

#db.close()

Как решить проблему?
  • Вопрос задан
  • 100 просмотров
Подписаться 1 Простой 5 комментариев
Решения вопроса 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
INSERT INTO result(name) VALUES (ilya)
Вы пытаетесь вставить в колонку name значение из колонки ilya. Строки должны быть в кавычках.
Для защиты от SQL-инъекции нужно использовать плейсхолдеры
- cur.execute(f'INSERT INTO result(name) VALUES ({data["Name"]})')
- db.commit()
- cur.execute(f'INSERT INTO result(name) VALUES({data['School_class']})')
+ cur.execute('INSERT INTO result(name, class) VALUES (?, ?)', (data["Name"], data['School_class']))
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
trapwalker
@trapwalker
Программист, энтузиаст
cur.execute(f'INSERT INTO result(name) VALUES ({data["Name"]})')

Так нельзя подставлять параметры в SQL-запрос по ряду причин. Ваша ошибка из-за отсутствия кавычек при такой подстановке, но даже если поставить кавычки в форматную строку так делать нельзя. Найдите любой простой отдельный работающий пример вставки в бд с передачей параметра и посмотрите. Таких в сети миллион. Можно ещё погуглить как правильно передавать параметры в sql-запос. а как неправильно и почему.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы