使用SUM()函数报错:'dict object' has no attribute 'SUM'
问题解决:Jinja模板中访问SQL聚合字段报错
'dict object' has no attribute 'SUM' 错误原因
你的SQL查询使用了SUM()聚合函数,但未给这些聚合结果指定别名,同时在Jinja模板里错误地用stock.SUM(shares)这种方式访问聚合字段——数据库返回的结果中,聚合字段的键名并非SUM(shares),且Jinja不支持这种带特殊符号的属性访问方式;另外模板里的{{ "stock.SUM(shares)" }}是直接输出字符串,并非访问变量。
解决方案
步骤1:修改SQL查询,为聚合字段添加别名
给SUM(shares)和SUM(total)指定清晰的别名,让返回的结果字典拥有明确可访问的键:
portfolio = db.execute("SELECT DISTINCT symbol, name, SUM(shares) AS total_shares, price, SUM(total) AS total_value FROM history GROUP BY name;")
步骤2:修正Jinja模板中的变量访问
把模板里错误的字段访问方式替换为对应的别名:
{% for stock in portfolio %} <tr> <td>{{ stock.symbol }}</td> <td>{{ stock.name }}</td> <td>{{ stock.total_shares }}</td> <td>{{ stock.price }}</td> <td>{{ stock.total_value }}</td> </tr> {% endfor %}
补充说明
如果暂时不想修改SQL查询,也可以通过字典键的方式直接访问未别名的聚合字段(不推荐,可读性差):
<td>{{ stock['SUM(shares)'] }}</td> <td>{{ stock['SUM(total)'] }}</td>
但这种方式容易出错,代码可读性低,优先推荐给聚合字段加别名的方案。
内容的提问来源于stack exchange,提问作者ryokans
相关产品推荐
相关产品推荐

