Python 仅当在try/except子句的范围内时,才会出现NoneType not SUBSCRIPPTABLE错误
出于某种原因,当我运行下面的脚本时,我没有得到任何Python 仅当在try/except子句的范围内时,才会出现NoneType not SUBSCRIPPTABLE错误,python,python-3.x,flask,sqlite,Python,Python 3.x,Flask,Sqlite,出于某种原因,当我运行下面的脚本时,我没有得到任何TypeError异常,我的应用程序运行没有问题。(我对数据库使用sqlite3,对应用程序本身使用Flask。) 似乎对于某些日期,没有任何数据,因此完全有可能偶尔出现NoneType。问题是,当我将代码更改为以下内容时,即出现NoneType not subscriptable错误 my_list = [] for dat in data: c.execute("""SELECT some_data FROM data_table W
TypeError
异常,我的应用程序运行没有问题。(我对数据库使用sqlite3,对应用程序本身使用Flask。)
似乎对于某些日期,没有任何数据,因此完全有可能偶尔出现NoneType
。问题是,当我将代码更改为以下内容时,即出现NoneType not subscriptable
错误
my_list = []
for dat in data:
c.execute("""SELECT some_data FROM data_table WHERE date='{}'""".format(dat))
try:
my_list.append(round(c.fetchone()[0]))
except:
my_list.append(c.fetchone()[0])
return my_list
假设,如果它遇到NoneType
对象,它将分支到except
子句,然后得到与原始代码块相同的结果。相反,我得到了这个错误,它破坏了我的烧瓶应用程序。如果有人能解释一下发生了什么,那就太棒了 c.fetchone()
如果没有更多的行可返回,则可以返回None
。如果您的SELECT
查询只生成一行,并且round()
引发了异常,那么再次调用c.fetchone()
可能会导致None
在除
处理程序中返回。这里的问题是多次调用c.fetchone()
不会导致后续调用返回相同的第一行
调用c.fetchone()
一次,并在对其执行任何操作之前测试它是否返回了除None
以外的值:
c.execute("""SELECT some_data FROM data_table WHERE date='{}'""".format(dat))
row = c.fetchone()
if row is not None:
try:
my_list.append(round(row[0]))
except ValueError: # value that can't be rounded
continue
请注意,除了语句之外,使用总括的语句几乎总是一个坏主意。只捕获预期的异常,不再捕获其他异常。您现在可以很容易地屏蔽内存错误或阻止中断
旁注:你完全可以接受。不要使用字符串格式插入值,始终使用SQL参数使数据库驱动程序正确处理转义值:
c.execute("""SELECT some_data FROM data_table WHERE date=?""", (dat,))
?
问号是一个SQL参数占位符,作为第二个参数传入的元组是参数值。请注意:您也会受到SQL注入攻击。请参阅我的答案中添加的旁注。谢谢。答案非常有用,但字符串格式不接受用户输入。它只是循环遍历我之前分配的列表“数据”中的项目。除非我弄错了,否则这将阻止任何SQL注入攻击。正确吗?该列表仍然可能直接或间接地来源于不受信任的数据。如果不是现在,将来可能会这样,你对列表的处理就会被忽略。最好使用参数。此外,使用参数可以使数据库引擎缓存该查询的查询计划,以及进行其他优化。
c.execute("""SELECT some_data FROM data_table WHERE date=?""", (dat,))