TypeError: object NoneType can't be used in 'await' expression
Пишу бот-опросник на питоне для ТГ. Данные кладу в объект, который я создал ранее.
Так же я создал бд с помощью SQLighter. В конце опроса закидываю данные в бд, и мне выскакивает ошибка:
TypeError: object NoneType can't be used in 'await' expression
Сюда приложу код:main
@dp.callback_query_handler(lambda c: c.data == 'send')
def send_data_to_base():
if not db.user_exist(storage.user_id) == False:
db.add_new_user(storage.user_id, storage.gender, storage.age, storage.salary, storage.gov_rate,
storage.city_condition, storage.level_of_development)
db code
import sqlite3
class SQLighter:
def __init__(self, database):
self.connection = sqlite3.connect(database)
self.cursor = self.connection.cursor()
def get_info(self):
with self.connection:
return self.cursor.execute("SELECT * FROM `answers`").fetchall()
def user_exist(self, user_id):
with self.connection:
result = self.cursor.execute("SELECT * FROM `answers` WHERE `user_id` = ?", (user_id,)).fetchall()
return bool(len(result))
def add_new_user(self, user_id, gender, age, salary, gov_rate, city_condition, level_of_development):
with self.connection:
return self.cursor.execute("INSERT INTO `answers` (`user_id`, `gender`, `age`, `salary`, `gov_rate`, `city_condition`, `level_of_development`) VALUES(?,?,?,?,?,?,?)", (user_id, gender, age, salary, gov_rate, city_condition, level_of_development))
Объект проверял на пустоту - он не пустой.
Так же, хотел бы узнать такое: бот собирает данные на клиентской стороне или на серверной? Имею введу, что если мой опрос буду проходить два и более людей одновременно, то будет ли работать мой способ сбора данных: данные в объект, а в конце опроса объект в бд?
PS: ботов никогда не писал, пользуюсь aiogram либой.
Ответы (1 шт):
Как исправить
Указанная ошибка обозначает, что вы берёте синхронную функцию и пытаетесь использовать её как асинхронную, а т.к. функция в вашем случае вернула None, получилась ошибка:
TypeError: object NoneType can't be used in 'await' expression
Среди тегов у вас указан aiogram, у которого хэндлеры должны быть асинхронными.
Добавьте к вашему хэндлеру async и проблема должна решиться.
@dp.callback_query_handler(text='send')
async def send_data_to_base(query: CallbackQuery):
...
asyncio
При работе с асинхронными приложениями старайтесь все операции, требующие ввода/вывода, оборачивать в asyncio. Для большинства библиотек уже есть готовые асинхронные аналоги. Например для sqlite есть: aiosqlite
Traceback
Надеюсь, что мой ответ поможет разобраться с использованием асинхронного кода. Но если найти проблему так и не получится - не стесняйтесь прикладывать traceback ошибки. Без него диагностировать место возникновения проблемы практически невозможно.