如何在InlineKeyboardButton中显示数据库数据?代码错误排查
问题排查与修复
核心错误点
- 数据库查询结果是元组而非字符串:
cur.execute返回的每一行是一个元组(比如("酷睿i9",)),直接赋值给text和callback_data会导致按钮显示异常,且callback_data不支持元组类型。 - 循环内重复发送消息:每次循环都调用
bot.send_message,会生成多条独立消息,而非一次性展示所有按钮的消息。
修复后的代码
elif call.data == "own1": reply_markup1 = types.InlineKeyboardMarkup(row_width=2) # 先遍历所有结果,把按钮都添加到键盘 for value in cur.execute("SELECT name FROM Processor where category_g='gaming';"): # 取元组第一个元素,拿到字符串格式的处理器名称 processor_name = value[0] item = types.InlineKeyboardButton(text=processor_name, callback_data=processor_name) reply_markup1.add(item) # 所有按钮添加完成后,只发送一次消息 bot.send_message(call.message.chat.id, "请选择处理器:", reply_markup=reply_markup1)
关键修改说明
- 从查询结果元组中提取字符串:用
value[0]获取处理器名称的字符串值,避免按钮显示元组格式内容。 - 调整消息发送时机:把
bot.send_message移出循环,确保所有按钮都添加到键盘后,一次性发送带完整键盘的消息。
内容的提问来源于stack exchange,提问作者Алексей Крылов
相关产品推荐
相关产品推荐

