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)) # Что-бы узнать работает ли функция
Вы ищете 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
Get help from others!
Recent Answers
Recent Questions
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP