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

Как исправить ошибку в PostgrSQL(asyncpg)?

Уже 2 дня осваиваю PostgreSQL. У меня есть таблица, одна из колонок называется user_id. С помощью питона я написал скрипт, который проверяет наличие user_id в одноименной таблице.

Вот код бд:
async def user_exists(user_id):
    conn = await asyncpg.connect(host=host, user=user, password=password, database=database)
    await conn.fetchrow("""SELECT * FROM users WHERE user_id = $1;""", user_id,)
    await conn.close()

Эту функцию я использую в основном коде следующим образом:
@dp.message_handler(commands=['start'])
async def bot_start(message: types.Message):
    if message.chat.type == "private":
        if not new_ton.user_exists(message.from_user.id):
            await new_ton.add_user(message.from_user.id)
    await message.answer(' Добро пожаловать', reply_markup=client_kb.main_buttons)

Проверка срабатывает, повторы невозможны, но в терминале выпрыгивает предупреждение, которое не влияет на работу, однако напрягает:
RuntimeWarning: coroutine 'user_exists' was never awaited
if not new_ton.user_exists(message.from_user.id):
RuntimeWarning: Enable tracemalloc to get the object allocation traceback

Есть следующий вариант:
@dp.message_handler(commands=['start'])
async def bot_start(message: types.Message):
    if message.chat.type == "private":
        user_exists = await new_ton.user_exists(message.from_user.id)
        if not user_exists:
            await new_ton.add_user(message.from_user.id)
    await message.answer(' Добро пожаловать', reply_markup=client_kb.main_buttons)

Предупреждение больше не появляется, однако и проверка не проходит, в таблице появляются дубликаты.

Как стоит поступить, в этом случае, подскажите, пожалуйста.
Может, стоит использовать ограничение UNIQUE при создании таблицы?
  • Вопрос задан
  • 159 просмотров
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 2
@Jack444
async def user_exists(user_id):
    conn = await asyncpg.connect(host=host, user=user, password=password, database=database)
    try: return await conn.fetchrow(f"SELECT 1 FROM users WHERE (user_id=} LIMIT 1")
    finally: await conn.close()
Ответ написан
AshBlade
@AshBlade
Просто хочу быть счастливым
Ошибка в том, что ты не await'ишь user_exists в if
@dp.message_handler(commands=['start'])
async def bot_start(message: types.Message):
    if message.chat.type == "private":
        # Вот здесь ты не вставил await
        if not new_ton.user_exists(message.from_user.id):
            await new_ton.add_user(message.from_user.id)
    await message.answer(' Добро пожаловать', reply_markup=client_kb.main_buttons)


@dp.message_handler(commands=['start'])
async def bot_start(message: types.Message):
    if message.chat.type == "private":
        # А вот здесь сделал
        user_exists = await new_ton.user_exists(message.from_user.id)
        if not user_exists:
            await new_ton.add_user(message.from_user.id)
    await message.answer(' Добро пожаловать', reply_markup=client_kb.main_buttons)


Вот так сделай
@dp.message_handler(commands=['start'])
async def bot_start(message: types.Message):
    if message.chat.type == "private":
        if not await new_ton.user_exists(message.from_user.id):
            await new_ton.add_user(message.from_user.id)
    await message.answer(' Добро пожаловать', reply_markup=client_kb.main_buttons)
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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