Как правильно проверить ID пользователя в базе данных?

У меня есть база данных - вайтлист, в которую я добавляю ID пользователя по команде, и этот ID сохраняется. Однако, когда я пытаюсь извлечь ID пользователя из базы данных и сравнить его с ID пользователя из чата, проверка не срабатывает должным образом: ID присутствует в базе, но выводит сообщение о том, что нет доступа. 

Код из db.py: 

```python
import sqlite3 
cursor.execute("CREATE TABLE white(adduser_id INT)") 

def get_users(adduser_id): 
    db = sqlite3.connect('data.db', check_same_thread=False) 
    cursor = db.cursor() 
    cursor.execute("SELECT adduser_id FROM white WHERE adduser_id=?", (adduser_id, )) 
    rows = cursor.fetchone() 
    print(rows) 
    return rows 
```

Код проверки из main.py: 

```python
@dp.message_handler(commands=['checkwhite']) 
async def close_bot(message: types.Message): 
    if db.get_users_exist(message.chat.id) == True: 
        if message.chat.id == db.get_users(message.chat.id): 
            await bot.send_message(chat_id=message.chat.id, text='Добро пожаловать') 
            print(db.get_users(message.chat.id)) 
        else: 
            await bot.send_message(chat_id=message.chat.id, text='у тебя нету прав') 
            print(db.get_users(message.chat.id))
``` 

Как я могу исправить эту проверку, чтобы она работала корректно?
  • 7 сентября 2024 г. 9:03
Ответы на вопрос 2
В вашем коде есть несколько проблем, которые могут вызывать неправильное поведение при проверке ID пользователя в базе данных. Давайте разберем ваш код и предложим исправления.

1. **Ошибка в определении функции `get_users_exist`**: У вас в коде вызывается функция `get_users_exist`, но вы не представили ее определение. Предположим, что эта функция возвращает `True`, если ID пользователя существует в базе данных. Убедитесь, что эта функция существует и правильно возвращает True/False.

2. **Проблема с возвращаемым значением `get_users`**: Функция `get_users` возвращает одну строку из базы данных, что может быть `None`, если пользователь не найден. Вам необходимо обработать это корректно.

3. **Сравнение ID**: Вам нужно правильно сравнивать ID пользователя из базы данных и ID из сообщения. У вас есть строки `db.get_users(message.chat.id)` и `message.chat.id`, которые могут не совпадать из-за неправильного обращения к возвращаемому значению. Метод `fetchone` возвращает кортеж, содержащий строку с ID пользователя, поэтому его нужно правильно разыменовать.

4. **Проверка на наличие ID**: Упрощаем условие. Вместо проверки на равенство вы можете проверить, содержится ли ID в результате запроса.

Вот возможный исправленный вариант вашего кода:

### db.py
```python
import sqlite3

def create_table():
    db = sqlite3.connect('data.db', check_same_thread=False)
    cursor = db.cursor()
    cursor.execute("CREATE TABLE IF NOT EXISTS white(adduser_id INT)")
    db.commit()
    db.close()

def get_users(adduser_id):
    db = sqlite3.connect('data.db', check_same_thread=False)
    cursor = db.cursor()
    cursor.execute("SELECT adduser_id FROM white WHERE adduser_id=?", (adduser_id,))
    row = cursor.fetchone()
    db.close()
    return row is not None  # Возвращаем True, если пользователь найден
```

### main.py
```python
@dp.message_handler(commands=['checkwhite'])
async def close_bot(message: types.Message):
    if db.get_users(message.chat.id):  # Проверяем, существует ли пользователь
        await bot.send_message(chat_id=message.chat.id, text='Добро пожаловать')
        print("Пользователь найден:", message.chat.id)
    else:
        await bot.send_message(chat_id=message.chat.id, text='У тебя нету прав')
        print("Пользователь не найден:", message.chat.id)
```

### Что изменилось:
1. Функция `get_users` теперь просто проверяет, найден ли пользователь, и возвращает `True` или `False`, при этом закрывая соединение с базой данных после запроса.
   
2. В `main.py` мы больше не используем лишние условия – теперь с помощью одного условия мы проверяем существование пользователя и выполняем соответствующий ответ.

3. Рекомендуется добавлять `CREATE TABLE IF NOT EXISTS` в вашем коде для предотвращения ошибок, если таблица уже существует.

Проверьте, чтобы в базе данных действительно существовали ожидаемые значения и соответствующие типы данных. Это должно помочь вам правильно проверять доступы пользователей.
fetchone возвращает кортеж (tuple), который вы сравниваете с целочисленным chdt_id. 
Замечания:
Используйте CREATE TABLE IF NOT EXISTS ...
Cтилистически, get_user s , row s - почему названия во множественном числе, если работа идёт с единичными объектами?
Похожие вопросы