Telegram数据库机器人信息展示故障及多词参数匹配问题
解决Telegram机器人多词产品名称提取与查询无响应问题
问题根源
- 参数提取失败:原代码用
re.match(" .*", event.message.text)提取产品名,但re.match仅从字符串开头匹配,而用户输入格式为/mostra 产品名称,开头是命令前缀,导致匹配返回None,传入SQL后触发异常,机器人无响应。 - 多词参数丢失:改用
split取list_of_words[1]仅能获取首个单词,无法处理带空格的多词产品名称(如「无线蓝牙耳机」),导致查询匹配失效。
修复方案
1. 正确提取完整参数
推荐使用正则捕获组在事件触发时直接获取命令后的完整内容,这是最可靠的方式:
- 修改事件匹配规则为
(?i)/mostra\s+(.*),其中(.*)会捕获命令后的所有字符(即完整产品名称)。 - 通过
event.pattern_match.group(1)提取捕获的参数,再去除前后空格。
2. 修复SQL查询逻辑
- 替换
REGEXP为LIKE(更适合模糊匹配产品名称,避免正则特殊字符干扰),如需精确匹配可改用=。 - 移除不必要的
conn.commit()(SELECT操作无需提交事务)。 - 用查询结果的长度判断是否存在匹配项,而非依赖
execute返回值。
3. 添加参数校验
防止用户仅输入命令前缀而未提供产品名称,提前提示用户补全信息。
完整修复代码
def create_message_select_query(ans): text = "" for i in ans: id = i[0] name = i[1] icon = i[2] # 修复原代码字符串拼接的语法错误 text += f"id: <b>{str(id)}</b> | <b>{str(name)}</b> | <b>{str(icon)}</b>\n" message = "<b>Received 📖 </b> Information about orders:\n\n" + text return message @client.on(events.NewMessage(pattern=r"(?i)/mostra\s+(.*)")) async def show_product(event): try: sender = await event.get_sender() SENDER = sender.id # 提取完整产品名称并去除前后空格 name = event.pattern_match.group(1).strip() # 校验是否输入产品名称 if not name: await client.send_message(SENDER, "请输入要查询的产品名称", parse_mode='html') return # 模糊匹配产品名称(如需精确匹配,将f"%{name}%"改为name,SQL用=) sql_command = "SELECT * FROM unitsprova WHERE name LIKE %s LIMIT 1;" crsr.execute(sql_command, (f"%{name}%",)) res = crsr.fetchall() if not res: text = f"未找到名称包含「{name}」的产品" await client.send_message(SENDER, text, parse_mode='html') else: text = create_message_select_query(res) await client.send_message(SENDER, text, parse_mode='html') except Exception as e: print(f"调试错误: {e}") await client.send_message(SENDER, "查询出错,请稍后重试", parse_mode='html') return
额外说明
- 如果必须使用
split方法提取参数,可使用split(maxsplit=1)仅分割一次,再合并后续内容:parts = event.message.text.split(maxsplit=1) if len(parts) < 2: await client.send_message(SENDER, "请输入要查询的产品名称", parse_mode='html') return name = parts[1].strip() - 若需使用
REGEXP进行正则匹配,需确保产品名称中的特殊字符已转义,避免SQL语法错误。
内容的提问来源于stack exchange,提问作者xXBERSERKXx
相关产品推荐
相关产品推荐

