Python中MySQL查询结果按金额、折扣金额、月份展示问题求助
解决Python中MySQL查询结果按月份分组并正确展示的问题
我明白你现在的困扰——在MySQL Workbench里能轻松实现的按月份统计金额和折扣金额的需求,放到Python代码里就出问题了。你的代码主要踩了两个常见坑,咱们一步步来解决:
原代码的核心问题
- 游标不匹配:你用
cursor1执行了第一个查询,却试图用cursor2.fetchall()获取结果,这肯定拿不到数据,因为cursor2根本没执行对应的查询语句 - 缺少分组逻辑:两次单独查询不同月份的写法不仅冗余,还没利用SQL的分组功能,没法自动按月份汇总数据
- 连接关闭错误:最后一行
conn.close少了括号,这是个语法错误,没法正确关闭数据库连接
修正后的完整代码
下面是优化后的代码,一次性解决所有问题,还能输出清晰的表格样式结果:
#!/usr/bin/env python import mysql.connector conn = None try: # 建立数据库连接 conn = mysql.connector.Connect( host="localhost", user="root", password="Karimanzira1978!", database="classicmodels" ) print("Connected to MySQL!") # 只用一个游标就足够,避免混淆 cursor = conn.cursor() # 优化SQL:按年月分组,一次性统计所有目标月份的数据 query = """ SELECT SUM(amount) AS amount, SUM(amount * 0.99) AS amount_discounted, DATE_FORMAT(paymentDate, '%Y-%m') AS month FROM payments WHERE paymentDate BETWEEN '2003-12-01' AND '2004-12-31' GROUP BY DATE_FORMAT(paymentDate, '%Y-%m') ORDER BY month; """ cursor.execute(query) # 获取所有查询结果 results = cursor.fetchall() # 打印表格表头 print("\n查询结果:") print("| 金额(amount) | 折扣金额(amount_discounted) | 月份(month) |") print("|--------------|-----------------------------|-------------|") # 格式化输出每一行数据,保留两位小数更直观 for row in results: print(f"| {row[0]:.2f} | {row[1]:.2f} | {row[2]} |") except Exception as ex: print("无法连接MySQL:异常信息:" + str(ex)) finally: # 确保无论是否出错,都关闭游标和连接 if conn is not None: cursor.close() conn.close() print("\n数据库连接已关闭。")
关键改进点说明
SQL语句优化:
- 用
DATE_FORMAT(paymentDate, '%Y-%m')把日期转换成YYYY-MM的标准月份格式 - 通过
GROUP BY按月份分组,一次查询就能统计2003年12月到2004年12月的所有月份数据,无需重复写两次查询 ORDER BY month保证结果按时间顺序排列,更易读
- 用
游标使用规范:
- 只创建一个游标对象,执行查询和获取结果用同一个游标,彻底避免游标不匹配的问题
表格样式输出:
- 手动打印表头和分隔线,把查询结果格式成类似Markdown表格的样式,比直接打印元组清晰得多
- 用
:.2f格式化金额,保留两位小数,符合财务数据的展示习惯
资源管理完善:
- 用
finally块确保游标和连接一定会被关闭,避免数据库连接泄漏
- 用
内容的提问来源于stack exchange,提问作者Chinyama
相关产品推荐
相关产品推荐

