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
相关产品推荐
相关产品推荐

