@buchanchik

Ошибка при использовании aiogram: Task exception was never retrieved, в чем проблема?

Здравствуйте, я создаю бота и в качестве инструмента использую aiogram.

Ошибка:
Task exception was never retrieved
future: <Task finished name='Task-9' coro=<Dispatcher._process_polling_updates() done, defined at D:\t_special_bot\venv\Lib\site-packages\aiogram\dispatcher\dispatcher.py:407> exception=NameError("name 'cur' is not defined")>
Traceback (most recent call last):
  File "D:\t_special_bot\venv\Lib\site-packages\aiogram\dispatcher\dispatcher.py", line 415, in _process_polling_updates
    for responses in itertools.chain.from_iterable(await self.process_updates(updates, fast)):
                                                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "D:\t_special_bot\venv\Lib\site-packages\aiogram\dispatcher\dispatcher.py", line 235, in process_updates
    return await asyncio.gather(*tasks)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "D:\t_special_bot\venv\Lib\site-packages\aiogram\dispatcher\handler.py", line 117, in notify
    response = await handler_obj.handler(*args, **partial_data)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "D:\t_special_bot\venv\Lib\site-packages\aiogram\dispatcher\dispatcher.py", line 256, in process_update
    return await self.message_handlers.notify(update.message)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "D:\t_special_bot\venv\Lib\site-packages\aiogram\dispatcher\handler.py", line 117, in notify
    response = await handler_obj.handler(*args, **partial_data)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "D:\t_special_bot\special_bot.py", line 48, in cmd_start
    await load_parameters(user_id=message.from_user.id)
  File "D:\t_special_bot\sqlite_db.py", line 15, in load_parameters
    user = cur.execute("SELECT 1 FROM vocab WHERE user_id == '{key}'".format(key=user_id)).fetchone()
           ^^^
NameError: name 'cur' is not defined


Код в основном файле:
from aiogram import types, executor, Bot, Dispatcher
from aiogram.contrib.fsm_storage.memory import MemoryStorage
import os
from aiogram.types import ReplyKeyboardMarkup, KeyboardButton, ReplyKeyboardRemove
from aiogram.dispatcher.filters.state import State, StatesGroup
from aiogram.dispatcher import FSMContext
from sqlite_db import db_start, load_parameters, edit_parameters



async def on_startup(_):
    await db_start()


storage=MemoryStorage()

bot = Bot(token=os.getenv('TOKEN'))
dp = Dispatcher(bot, storage=storage)



#CLASSES
class DBStatesGroup(StatesGroup):
    date = State()
    ammount = State()

async def on_startup(_):
    print('Bot is online')



#KEYBOARD
b1 = KeyboardButton('/Загрузить')

kb_client = ReplyKeyboardMarkup(resize_keyboard=True, one_time_keyboard=True)

kb_client.add(b1)


#srart
@dp.message_handler(commands=['start'])
async def cmd_start(message: types.Message):
    await message.answer('Привет, я бот, который учит новым языкам. В выбранные тобой дату и время я буду присылать выбранное тобой количество слов, которые ты должен будешь выучить. Если не будешь следовать моим указаниям и не будешь учить слова, то я за тобой приду и поможет тебе только совершенное знание нового языка. Удачи на твоем пути:D', reply_markup=kb_client)
    await load_parameters(user_id=message.from_user.id)




#fsm(обработка ответов пользователя и запись их во временное хранилище данных)
@dp.message_handler(commands='Загрузить', state=None)
async def cmd_load(message : types.Message):
    await message.reply('Скажи, когда присылать слова?')
    await DBStatesGroup.date.set()



#проверка формата записи
@dp.message_handler(lambda message: not message.text.isdigit(), state=DBStatesGroup.date)
async def check_date(message: types.Message):
    await message.reply('Неверный формат даты, поменяйте на (дд.мм.гг).')

@dp.message_handler(lambda message: not message.text.isdigit() or float(message.text) < 1 or float(message.text) > 20, state=DBStatesGroup.ammount)
async def check_ammount(message: types.Message):
    await message.reply('Неверный формат количества, слов может быть не меньше 0 и не больше 20.')




#ловим первый ответ от пользователя
@dp.message_handler(state=DBStatesGroup.date)
async def load_when(message: types.Message, state: FSMContext):
    async with state.proxy() as data:
        data['date'] = message.text
    await message.reply('Теперь скажи, сколько слов присылать.')
    await DBStatesGroup.next()

#второй ответ
@dp.message_handler(state=DBStatesGroup.ammount)
async def load_how_much(message: types.Message, state: FSMContext):
    async with state.proxy() as data:
        data['ammount'] = message.text
        await message.answer(data)
        print(data)
    
    await edit_parameters(state, user_id=message.from_user.id)
    await message.reply('Отлично, все параметры успешно заданы!')
    await state.finish()





#реакция на любое нажатие
@dp.message_handler()
async def echo_send(message : types.Message):
    await message.answer("Пык /start")


Код в файле с бд:
import sqlite3 as sq

async def db_start():
   global db, cur

   db = sq.connect('vocab.db')
   cur = db.cursor()
   if db:
      print('DB is connected')
   
   cur.execute("CREATE TABLE IF NOT EXISTS users(user_id TEXT PRIMARY KEY, date_and_time TEXT, word_drop TEXT, learned_words_id TEXT")
   db.commit()

async def load_parameters(user_id):
   user = cur.execute("SELECT 1 FROM vocab WHERE user_id == '{key}'".format(key=user_id)).fetchone()
   if not user:
      cur.execute("INSERT INTO vocab VALUES(?, ?, ?, ?)", (user_id, '', '', ''))
      db.commit()

async def edit_parameters(state, user_id):
   async with state.proxy() as data:
      cur.execute("UPDATE vocab SET date_and_time = '{}', word_drop = '{}' WHERE user_id == '{}'".format(data['date'], data['ammount'], user_id))
      db.commit()
  • Вопрос задан
  • 284 просмотра
Решения вопроса 1
@buchanchik Автор вопроса
вот так работает
import sqlite3 as sq
db, cur = None, None

async def db_start():
   global db, cur
   db = sq.connect('vocab.db')
   cur = db.cursor()
   if db:
      print('DB is connected')
   
   cur.execute('CREATE TABLE IF NOT EXISTS users(user_id TEXT PRIMARY KEY, date_and_time TEXT, word_drop TEXT, learned_words_id TEXT)')
   db.commit()

# async def load_parameters(user_id):
#    user = cur.execute("SELECT 1 FROM vocab WHERE user_id == '{key}'".format(key=user_id)).fetchone()
#    if not user:
#       cur.execute("INSERT INTO vocab VALUES(?, ?, ?, ?)", (user_id, '', '', ''))
#       db.commit()

async def edit_parameters(state, user_id):
   async with state.proxy() as data:
      # cur.execute("UPDATE vocab SET date_and_time = '{}', word_drop = '{}' WHERE user_id == '{}'".format(data['date'], data['ammount'], user_id))
      # db.commit()
      cur.execute('INSERT INTO users VALUES (?, ?, ?, ?)', tuple(data.values()))
      db.commit
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@abdullokh_apo
Думаю лучше реализовать в виде класса

import sqlite3


class MyDB:

    def __init__(self):
        self.connection = sqlite3.connect('path/to/db/file')
        self.cursor = self.connection.cursor()

    def load_parameters(user_id):
        with self.connection:
                 user = cur.execute("SELECT 1 FROM vocab WHERE user_id = '{key}'".format(key=user_id)).fetchone()
                 if not user:
                     cur.execute("INSERT INTO vocab VALUES(?, ?, ?, ?)", (user_id, '', '', ''))


Потом в основном файле создадите
db = MyDB()

db.load_parameters(123)


P.S. Запросы будут синхронными
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы