TransWikia.com

Как проверить существует ли такой пользователь в БД?

Stack Overflow на русском Asked by AyuB_I on November 29, 2020

Я создаю телеграм бот в aiogram, я сделал всё что мог и попробовал все способы которые нашел в интернете.
Мой код не работает и всегда возвращает False.

Это код в файле где я создал функции для управление БД:

class SQLighter:
def __init__(self, database_file):
    """ Подключаемся к базе данных """
    self.connection = sqlite3.connect(database=database_file)
    self.cursor = self.connection.cursor()

def get_users(self, status=True):
    """ Получаем активных пользователей """
    with self.connection:
        return self.cursor.execute("SELECT * FROM 'users' WHERE 'status' = ?", (status,)).fetchall()

def user_exists(self, user_id):
    """ Проверяем есть ли такой пользователь в БД """
    with self.connection:
        result = self.cursor.execute("SELECT * FROM 'users' WHERE 'user_id' = ?)", (user_id,)).fetchall()
        return bool(len(result))

def add_user(self, user_id, user_name, name_input, full_name, status=True):
    """ Добавляем пользователя в БД """
    with self.connection:
        return self.cursor.execute("INSERT INTO 'users'('user_id', 'user_name', 'full_name', 'status') 
        VALUES (?, ?, ?, ?)", (user_id, user_name, full_name, status))

def add_phone_number(self, user_id, phone_number):
    """ Добавляем номер телефона в БД """
    return self.cursor.execute("UPDATE 'users' SET 'phone_number' = ? WHERE 'user_id' = ?", (phone_number, user_id))

def update_status(self, user_id, status):
    """ Обновляем статус подписки """
    return self.cursor.execute("UPDATE 'users' SET 'status' = ? WHERE 'user_id' = ?", (status, user_id))

def close(self):
    """ Закрываем соединение с БД """
    self.connection.close()

Код не работает здесь:

def user_exists(self, user_id):
""" Проверяем есть ли такой пользователь в БД """
with self.connection:
    result = self.cursor.execute("SELECT * FROM 'users' WHERE 'user_id' = ?)", (user_id,)).fetchall()
    return bool(len(result))

Здесь я использую эту функцию:

from aiogram.dispatcher.filters import CommandStart
from aiogram import types
from keyboards.default import home_page
from loader import dp
from sqlighter import SQLighter

"""Инициализируем соединение с БД"""

db = SQLighter("db.db")


@dp.message_handler(CommandStart())
async def on_start(message: types.Message):
    await message.answer(f'Aссаламу Алейкум {message.from_user.full_name}!nnЯ БОТ пицереии "AyuB's Pizza"',
                         reply_markup=home_page)

    if not db.user_exists(message.from_user.id):
        db.add_user(message.from_user.id, message.from_user.username, message.from_user.full_name)

    else:
        db.update_status(message.from_user.id, True)

    print(db.user_exists(message.from_user.id))  # Что-бы узнать работает ли функция

One Answer

Вы ищете user_id в колонке user_name, конечно не будет совпадений. Если все таки ищете по id, то код такой:

def user_exists(self, user_id):
    """ Проверяем есть ли такой пользователь в БД """
    with self.connection:
        result = self.cursor.execute("SELECT * FROM users WHERE user_id = ?", (user_id,)).fetchall()
        return bool(len(result))

А если по имени, то у вас путаница с именованием переменных, стоит изменить на:

def user_exists(self, user_name):
""" Проверяем есть ли такой пользователь в БД """
with self.connection:
    result = self.cursor.execute("SELECT * FROM users WHERE user_name = ?", (user_name,)).fetchall()
    return bool(len(result))

UPD. И вам хватит первого совпадения, так что лучше fetchall() заменить на fetchone()


UPD2. Пройдитесь по всему коду по синтаксису - это основная проблема. Вот так все работает:

result = self.cursor.execute("SELECT * FROM users WHERE user_id = ?", (user_id,)).fetchone()

Correct answer by Serg Bocharov on November 29, 2020

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP