Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 仅当在try/except子句的范围内时,才会出现NoneType not SUBSCRIPPTABLE错误_Python_Python 3.x_Flask_Sqlite - Fatal编程技术网

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,))