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

Тг бот на python должен был брать данные клиента с бд(psql) но почему то он ищет несуществующий user id хотя в бд только 1 пользователь с другим id?

Тг бот на python должен был брать данные клиента с бд(psql) но почему то он ищет несуществующий user id хотя в бд только 1 пользователь с другим id в pgAdmin4 проверял сохранились ли данные но все равно бот не види пользоваателя в бд. Вот логгинг
67bde2213e84f565788650.png
а вот сам код(не весь)
def register_user(user_id, first_name, last_name, phone, address):
    try:
        cur.execute("""
            INSERT INTO users (user_id, first_name, last_name, phone, address)
            VALUES (%s, %s, %s, %s, %s)
            ON CONFLICT (user_id) DO UPDATE 
            SET first_name = EXCLUDED.first_name, 
                last_name = EXCLUDED.last_name, 
                phone = EXCLUDED.phone, 
                address = EXCLUDED.address;
        """, (user_id, first_name, last_name, phone, address))
        conn.commit()  # <== БЕЗ ЭТОГО МОЖЕТ НЕ РАБОТАТЬ
        logging.info(f"✅ Пользователь {user_id} зарегистрирован!")
    except Exception as e:
        conn.rollback()  # ОТКАТ, если ошибка
        logging.error(f"❌ Ошибка при регистрации пользователя: {e}")

        
# Функция для получения данных пользователя
def get_user_data(user_id):
    """Получает данные пользователя по его Telegram ID."""
    try:
        conn.commit()  # Обновим данные перед запросом
        print(f" Ищем пользователя с ID: {user_id}")  # Вывод перед запросомprint(f" Ищем в БД пользователя с ID: {user_id}")  
        cur.execute("SELECT first_name, last_name, phone, address FROM users WHERE user_id = %s", (user_id,))
        user = cur.fetchone()
        print(f" Найден пользователь: {user}")  # Что вернулось из базы?
        return user if user else None
    except Exception as e:
        logging.error(f"Ошибка при получении данных пользователя: {e}")
        return None




# Хранилище данных пользователей (user_id -> данные)
user_data = {}

# Определяем состояния
class OrderState(StatesGroup):
    choosing_delivery = State()
    choosing_category = State()
    choosing_drink = State()
    choosing_volume = State()
    choosing_quantity = State()
    entering_custom_quantity = State()
    entering_customer_info = State()
    entering_first_name = State()
    entering_last_name = State()
    entering_phone = State()
    entering_address = State()

# Главное меню
@dp.message_handler(commands=['start'])
async def start_command(message: types.Message):
    keyboard = ReplyKeyboardMarkup(resize_keyboard=True)
    keyboard.add(KeyboardButton(" Заказать напиток"))
    keyboard.add(KeyboardButton(" Регистрация"))
    await message.answer("Привет! Добро пожаловать в наш бот-бар! \nНажмите кнопку ниже, чтобы сделать заказ или зарегистрироваться.", reply_markup=keyboard)
    print(message.from_user.id)  # Ошибка! message не определён


# Регистрация
@dp.message_handler(lambda message: message.text == " Регистрация")
async def registration(message: types.Message):
    await message.answer("Введите ваше Имя:")
    await OrderState.entering_first_name.set()

@dp.message_handler(state=OrderState.entering_first_name)
async def process_first_name(message: types.Message, state: FSMContext):
    await state.update_data(first_name=message.text)
    await message.answer("Введите вашу Фамилию:")
    await OrderState.entering_last_name.set()

@dp.message_handler(state=OrderState.entering_last_name)
async def process_last_name(message: types.Message, state: FSMContext):
    await state.update_data(last_name=message.text)
    await message.answer("Введите ваш Телефон (с кодом страны):")
    await OrderState.entering_phone.set()

@dp.message_handler(state=OrderState.entering_phone)
async def process_phone(message: types.Message, state: FSMContext):
    await state.update_data(phone=message.text)
    await message.answer("Введите ваш Адрес доставки:")
    await OrderState.entering_address.set()

@dp.message_handler(state=OrderState.entering_address)
async def process_address(message: types.Message, state: FSMContext):
    await state.update_data(address=message.text)

    user_id = message.from_user.id
    data = await state.get_data()
    first_name = data['first_name']
    last_name = data['last_name']
    phone = data['phone']
    address = data['address']

    try:
        conn = psycopg2.connect(
            dbname=",#Тут мое название бд
            user="postgres",
            password="",#тут мой пароль
            host="localhost",  # или IP вашего сервера
            port="5432"
        )
        cur = conn.cursor()

        cur.execute("""
            INSERT INTO users (user_id, first_name, last_name, phone, address)
            VALUES (%s, %s, %s, %s, %s)
            ON CONFLICT (user_id) DO UPDATE 
            SET first_name = EXCLUDED.first_name, 
                last_name = EXCLUDED.last_name, 
                phone = EXCLUDED.phone, 
                address = EXCLUDED.address
        """, (user_id, first_name, last_name, phone, address))

        conn.commit()

        logging.info(f"✅ Данные сохранены: {user_id}, {first_name} {last_name}, {phone}, {address}")
        await message.answer("✅ Ваши данные успешно сохранены!")

    except Exception as e:
        logging.error(f"❌ Ошибка при сохранении данных: {e}")
        await message.answer("❌ Произошла ошибка при сохранении ваших данных. Попробуйте еще раз.")

    await state.finish()

# Запрос данных пользователя
@dp.message_handler(state=OrderState.entering_customer_info)
async def register_customer(message: types.Message, state: FSMContext):
    user_data = message.text.split(", ")
    
    if len(user_data) == 3:
        first_name,last_name, phone, address = user_data
        user_id = message.from_user.id
        # Регистрация пользователя
        register_user(user_id, first_name,last_name, phone, address)

        await message.answer(f"Спасибо за регистрацию! Ваши данные сохранены:\nИмя: {first_name}\nФамилия: {last_name}\nТелефон: {phone}\nАдрес: {address}")
        await start_command(message)  # Возвращаем к главному меню
    else:
        await message.answer("Ошибка: пожалуйста, введите данные в формате:\nИмя, Телефон, Адрес")

# Отправка данных заказа
async def send_order(message, state):
    data = await state.get_data()
    drink = data["drink"]
    volume = data["volume"]
    quantity = data["quantity"]
    price = data["price"]
    delivery_type = data["delivery_type"]

    user_id = message.from_user.id
    user_data = get_user_data(user_id)

    if user_data:
        first_name, last_name, phone, address = user_data
        await message.answer(
            f"✅ Ваш заказ принят!\n\n"
            f" Напиток: {drink}\n"
            f" Объем: {volume} мл\n"
            f" Количество: {quantity}\n"
            f" Цена: {int(price) * int(quantity)}₽\n"
            f" Доставка: {delivery_type}\n\n"
            f" Ваши данные:\n"
            f"Имя: {first_name} {last_name}\n"
            f" Телефон: {phone}\n"
            f" Адрес: {address}"
        )

        # Отправляем заказ в канал
        await bot.send_message(
            CHANNEL_ID,
            f" *Новый заказ!*\n\n"
            f" Напиток: {drink}\n"
            f" Объем: {volume} мл\n"
            f" Количество: {quantity}\n"
            f" Цена: {int(price) * int(quantity)}₽\n"
            f" Доставка: {delivery_type}\n\n"
            f" *Клиент:* {first_name} {last_name}\n"
            f" Телефон: {phone}\n"
            f" Адрес: {address}",
            parse_mode="Markdown"
        )

        await state.finish()
    else:
        await message.answer("❌ Ошибка: ваши данные не найдены в базе. Пожалуйста, зарегистрируйтесь через /start.")

# Запуск бота
if __name__ == '__main__':
    executor.start_polling(dp, skip_updates=True)

Помогите найти проблему,пытался у гпт спросить не дал норм ответа
  • Вопрос задан
  • 47 просмотров
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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