Python for循环中sum变量仅存储最后一个值的问题如何解决?
问题根因
- 核心错误是累加变量的初始化位置错误:你将
sum = 0写在了for record in records:循环内部,每次遍历新的product_id对应记录时都会把sum重置为0,最终sum只会保留最后一个record对应的所有record1的累加结果,无法实现全量数据累加。 - 额外存在两个不规范问题:直接拼接SQL语句存在SQL注入风险;使用Python内置函数
sum作为变量名会覆盖原有内置功能,不推荐使用。
修复方案
方案1:仅调整累加变量初始化位置(最小改动)
把sum的初始化语句移到所有循环外层即可,同时替换变量名避免覆盖内置函数,修改后代码如下:
# 累加变量初始化放在最外层,避免每次循环被重置 total = 0 # 改用参数化查询避免SQL注入风险 query = "SELECT product_id FROM product_orders WHERE table_number = %s" cursor.execute(query, (e,)) records = cursor.fetchall() for record in records: query2 = "SELECT * FROM productss WHERE id = %s" cursor.execute(query2, (record[0],)) record2 = cursor.fetchall() for record1 in record2: total = total + record1[2] tree.insert("", tk.END, values=record1) tree2.insert("", tk.END, values=total)
方案2:优化SQL逻辑(性能更优)
直接通过SQL关联查询一次性拿到所有需要的明细数据,也可以直接在SQL中完成总和计算,减少数据库查询次数和Python层循环逻辑:
# 关联查询直接拿到所有需要的明细,同时用开窗函数计算全局总和 query = """ SELECT p.*, SUM(p.你要累加的字段名) OVER() AS total_sum FROM product_orders po INNER JOIN productss p ON po.product_id = p.id WHERE po.table_number = %s """ cursor.execute(query, (e,)) all_data = cursor.fetchall() total = 0 if all_data: # 所有行的最后一列都是全局总和,取第一行的最后一列即可 total = all_data[0][-1] for row in all_data: # 插入明细时去掉最后一列的总和字段 tree.insert("", tk.END, values=row[:-1]) tree2.insert("", tk.END, values=total)
内容的提问来源于stack exchange,提问作者Osama Ashour
相关产品推荐
相关产品推荐

