Telebot+SQLite3开发Telegram Bot出现TypeError的原因与修复
TypeError: 'NoneType' object is not subscriptable 错误分析与修复
错误原因
这个错误出现在return city[0]行,说明变量city的值是None——也就是你的SQL查询没有从users表中获取到任何结果,常见诱因包括:
- 传入函数的用户ID无效,或者该用户从未被写入users表
- SQL查询语句存在错误:比如字段名拼写错误(如把
city_living写成city_livng)、表名错误,或者WHERE条件与数据库中记录不匹配 - 数据库操作逻辑遗漏:比如执行
execute()后未调用fetchone()/fetchall()获取结果,导致city未被正确赋值
修复方法
1. 先判断查询结果再访问下标
修改get_city_living函数,先检查city是否为None,避免直接下标访问:
import sqlite3 def get_city_living(user_id): conn = sqlite3.connect('your_database.db') cursor = conn.cursor() # 确保SQL语句的字段名、表名拼写正确 cursor.execute("SELECT city_living FROM users WHERE user_id = ?", (user_id,)) city = cursor.fetchone() conn.close() # 仅当查询到结果时返回字段值,否则返回默认值(可根据业务调整为空字符串等) return city[0] if city is not None else None
2. 排查查询逻辑与数据
- 验证传入的user_id是否正确:在profile回调逻辑中,确认获取的是当前用户的真实ID(比如Telebot中用
callback_query.from_user.id而非其他错误值) - 检查数据库表结构:确认users表确实存在
city_living字段,表名拼写无误 - 直接验证SQL查询:用SQLite工具执行
SELECT city_living FROM users WHERE user_id = '你的测试用户ID',确认是否能返回有效结果
3. 增强函数鲁棒性(可选)
添加异常捕获,处理数据库连接或查询时的错误:
import sqlite3 def get_city_living(user_id): conn = None try: conn = sqlite3.connect('your_database.db') cursor = conn.cursor() cursor.execute("SELECT city_living FROM users WHERE user_id = ?", (user_id,)) city = cursor.fetchone() return city[0] if city is not None else None except sqlite3.Error as e: print(f"数据库操作错误: {str(e)}") return None finally: if conn: conn.close()
内容的提问来源于stack exchange,提问作者RETURNGOGOLL
相关产品推荐
相关产品推荐

