You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 01:43:25