Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

БД и python aiogram

Дед Ученик (206), закрыт 8 месяцев назад
Кто может хелпануть? Мне надо чтобы товары из БД выводились в чат в виде кнопок, а при нажатии кнопок была инфа о товаре

вот сам код бд и кнопка каталога (На всякий прикреплю скрин бд)
 import sqlite3 as sq 

db = sq.connect('tg.db')
cur = db.cursor()

async def db_start():
cur.execute("CREATE TABLE IF NOT EXISTS accounts("
"id INTEGER PRIMARY KEY AUTOINCREMENT, "
"tg_id INTEGER, "
"cart_id TEXT)")
cur.execute("CREATE TABLE IF NOT EXISTS items("
"i_id INTEGER PRIMARY KEY AUTOINCREMENT, "
"name TEXT, "
"desc TEXT, "
"price TEXT, "
"photo TEXT, "
"brand TEXT)")
db.commit()

async def cmd_start_db(user_id):
user = cur.execute("SELECT * FROM accounts WHERE tg_id = ?", (user_id,)).fetchone()
if not user:
cur.execute("INSERT INTO accounts(tg_id) VALUES (?)", (user_id,))
db.commit()


async def add_item(state):
async with state.proxy() as data:
cur.execute("INSERT INTO items (name, desc, price, photo, brand) VALUES (?, ?, ?, ?, ?)",
(data['name'], data['desc'], data['price'], data['photo'], data['type']))
db.commit()


async def get_items():
cur.execute("""SELECT * FROM items""").fetchall()

async def get_user_items(i_id):
cur.execute("""SELECT * FROM items WHERE i_id=(?)""", [i_id]).fetchall()

async def get_cart(user_id):
cur.execute("""SELECT * FROM cart_id WHERE user_id=(?)""", [user_id]).fetchall()

async def add_to_cart(user_id, i_id):
cur.execute("""INSERT INTO cart_id (user_id, i_id) VALUES (?, ?)""",
[user_id, i_id])


async def mt_cart(user_id):
cur.execute("""DELETE FROM cart_id WHERE user_id=(?)""", [user_id])
 @dp.message_handler(text=['? Каталог']) 
async def listofitems(message: typesm):
await bot.send_message(message.chat.id, 'Каталог пуст!', reply_markup=btn.catalogtype)
Буду оч благодарен если поможет кто-нибудь
Лучший ответ
e404 Мыслитель (5616) 8 месяцев назад
Недавно писал такого бота, только на telebot. Скину код, мб поможет.
Это чтобы товары из БД выводились в виде inline-кнопок:
    if call.data == 'add_product1': 
products = sql.execute("SELECT * FROM user").fetchall()

product_menu = types.InlineKeyboardMarkup()

for product in products:
product_button = types.InlineKeyboardButton(product[3], callback_data='product_' + str(product[0]))
product_menu.add(product_button)

bot.edit_message_text(chat_id=call.message.chat.id, text=f'? Доступный список товаров в боте:', reply_markup=product_menu)
Если пойдет, то могу еще код кинуть. Но чтобы при нажатии на определенный товар именно о нем инфа была я не реализовал.
ДедУченик (206) 8 месяцев назад
Спасибо) Если можно, скинешь тогда код чтобы была информация о товаре?
e404 Мыслитель (5616) Дед, я что-то такое написал:
     if call.data.startswith('product_'): 
        product_id = call.data.split('_')[1] 
         
        cursor.execute('SELECT * FROM product WHERE id = ?', (product_id,)) 
        product = cursor.fetchone() 
         
        if product: 
            name, description, price = product 
            message_text = f"? Товар:\n{name}\nОписание: {description}\nЦена: {price}₽" 
            bot.edit_message_text(chat_id=call.message.chat.id, message_id=call.message.message_id, text=message_text) 
Но работал криво и даже иногда ошибку выдавал, сыро короче. Может быть разберешься дальше и доработаешь)
Остальные ответы
Chudo_Chudnoe Мастер (2187) 8 месяцев назад
Сначала импортируй зависимости:

 from aiogram import types 
from aiogram.types import InlineKeyboardMarkup, InlineKeyboardButton

И собственно сам код:

 @dp.message_handler(text=['? Каталог']) 
async def listofitems(message: types.Message):
items = await get_items()
if items:
markup = InlineKeyboardMarkup(row_width=1)
for item in items:
button_text = f"{item['name']} - {item['price']}р."
callback_data = f"item_{item['i_id']}"
markup.add(InlineKeyboardButton(button_text, callback_data=callback_data))
await message.answer("Выберите товар:", reply_markup=markup)
else:
await message.answer("Каталог пуст!")

@dp.callback_query_handler(lambda c: c.data and c.data.startswith('item_'))
async def item_callback_handler(callback_query: types.CallbackQuery):
item_id = int(callback_query.data.split('_')[1])
items = await get_user_items(item_id)
if items:
item = items[0]
text = f"Название: {item['name']}\nОписание: {item['desc']}\nЦена: {item['price']}р."
await bot.send_photo(callback_query.from_user.id, item['photo'], caption=text)
else:
await callback_query.answer("Товар не найден", show_alert=True)

await callback_query.answer()

Функции get_items и get_user_items, должны использовать async с ключевым словом await, если раз ты используешь асинхронный SQL-клиент.
Кроме того, убедись, что items и get_user_items возвращают список словарей.
Похожие вопросы