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

