SQLite空表SUM查询返回None时如何将amountsum赋值为0?
解决SQLite3 SUM查询空表返回None导致的类型错误问题
你遇到的问题很典型——当SQLite的SUM()函数作用于空表或者没有匹配条件的行时,会返回NULL,而你当前的代码逻辑没处理对查询结果的结构,导致判断失效。
问题根源
你的代码里用fetchall()得到的data是一个包含元组的列表,哪怕没有数据,它也会是[(None,)],而不是None。所以if data == None:这个判断永远不会触发,amountsum被赋值成了这个元组,后续和整数100做减法时自然会报类型错误。
解决方案
这里有两种简洁的处理方式,推荐结合参数化查询一起用(替换你原来的字符串拼接,避免SQL注入风险):
方案1:在Python代码里处理NULL值
用fetchone()代替fetchall()(因为SUM只会返回一行结果,更高效),然后提取结果并判断是否为None:
c = conn.cursor() # 用参数化查询,避免SQL注入,同时让代码更健壮 query = "SELECT SUM(amount) FROM test WHERE date BETWEEN ? AND ?" # 把你的blah起始和结束日期作为参数传入 c.execute(query, (blah_start_date, blah_end_date)) result = c.fetchone() # 提取元组里的第一个值,是None的话就赋值为0 amountsum = result[0] if result[0] is not None else 0 print(amountsum) output = 100 - amountsum print(output)
方案2:在SQL语句里直接处理NULL(更优雅)
SQLite支持COALESCE()函数,它会返回传入参数里第一个非NULL的值。我们可以直接在查询里把SUM的结果和0结合,这样查询结果永远不会是None:
c = conn.cursor() # 用COALESCE把SUM的NULL结果替换成0 query = "SELECT COALESCE(SUM(amount), 0) FROM test WHERE date BETWEEN ? AND ?" c.execute(query, (blah_start_date, blah_end_date)) result = c.fetchone() # 直接取结果就行,已经确保是整数了 amountsum = result[0] print(amountsum) output = 100 - amountsum print(output)
额外提醒
一定要用参数化查询(也就是execute()的第二个参数传元组),不要用字符串拼接来构造SQL语句——后者不仅容易出现语法错误,还会带来严重的SQL注入安全隐患。
内容的提问来源于stack exchange,提问作者Oliver Almonte
相关产品推荐
相关产品推荐

