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

Python sqlite3中fetchone与fetchone[0]的区别及无记录异常处理

问题1:为什么去掉[0]后功能无法正常运行

sqlite3游标对象的fetchone()方法的返回规则是:

  • 存在匹配记录时,返回由该行所有查询字段组成的元组,哪怕你只查询remedy一个字段,返回结果也会是('xxx防治方案',)格式的长度为1的元组,不是直接返回字段值
  • 没有匹配记录时,返回None
    你业务中需要用到的是remedy字段的字符串值,不加[0]拿到的是元组,自然不符合后续业务逻辑的使用要求,所以功能异常。

问题2:无匹配记录时的None异常处理

你现在的写法在无匹配时,fetchone()返回None,直接执行[0]取值会抛出TypeError: 'NoneType' object is not subscriptable异常,可按如下逻辑优化。
额外提示:你当前用f字符串拼接SQL的写法存在SQL注入风险,建议替换为sqlite3的参数化查询写法,同时补充数据库连接关闭逻辑,避免资源泄漏。

优化后代码示例

import sqlite3

def remedysql(crop, disease):
    conn = None
    try:
        conn = sqlite3.connect('plant_protection.db')
        mycur = conn.cursor()
        # 使用参数化查询,避免SQL注入
        sql = 'select remedy from pp_remedy WHERE crop=? and disease=?'
        mycur.execute(sql, (crop, disease))
        res = mycur.fetchone()
        # 先判断查询结果是否为空再取值
        return res[0] if res is not None else None
    except sqlite3.Error as error:
        print("Error while connecting to sqlite plantprot DB", error)
        return None
    finally:
        # 确保数据库连接最终被关闭
        if conn:
            conn.close()

如果业务需要无匹配时返回提示文本,可把代码中的None替换为自定义内容,比如"暂无对应的防治方案"。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 12:18:03