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

Python操作sqlite3执行SELECT查询text字段返回None问题求助

问题排查与解决方法

原因1:查询传入的user_id类型或值不匹配

你表结构中id字段定义为INTEGER主键,若调用get_text时传入的user_id是字符串格式的数字(如"393120847059091456"而非整数类型),或者传入的id值和插入时的id不一致,都会导致匹配失败返回None。

  • 验证方式:在get_text的execute语句前添加调试代码:print(type(user_id), user_id),确认输入为int类型,且值和插入时的user_id完全一致。
  • 解决方法:调用get_text前强制转换参数为整数:user_id = int(user_id),同时确认传参值正确。

原因2:两次操作连接的不是同一个数据库文件

你代码中用相对路径db/mydb.db连接数据库,如果执行create_user和get_text时的工作目录不同,会导致两次连接的是不同位置的数据库文件:插入操作的数据写入了A路径的库,查询时读取的是空的B路径的库,自然返回None。

  • 验证方式:修改get_connection函数,打印数据库文件的绝对路径确认一致性:
import os
def get_connection():
    try:
        db_path = os.path.abspath('db/mydb.db')
        print("当前连接数据库路径:", db_path)
        con = sqlite3.connect(db_path)
        return con
    except:
        print('Unable to connect to database. Please try again later.\n')
        exit(1)
  • 解决方法:统一使用绝对路径连接数据库,基于当前脚本路径构造固定的数据库路径:
import os
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
DB_PATH = os.path.join(BASE_DIR, 'db/mydb.db')
# 连接时使用DB_PATH即可

原因3:插入操作未成功持久化到磁盘

你当前create_user的执行顺序是INSERT→同连接查询→COMMIT,同一个数据库连接下未提交的事务对当前连接可见,所以你插入后立即查询能拿到数据,但如果commit阶段出现异常被静默忽略,数据实际没有写入磁盘,后续新连接查询就会返回空。

  • 验证方式:插入完成后用SQLite可视化工具直接打开数据库文件,确认对应id的记录确实存在。
  • 解决方法:给create_user的commit操作添加异常捕获,确认提交环节没有报错。

优化建议

只读查询操作不需要执行con.commit(),可以删掉get_text函数中的commit语句,避免不必要的事务开销。

内容的提问来源于stack exchange,提问作者CodeIsLaw

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 19:36:03