如何将MySQL数据库列总和存入Python变量并计算积分写入新表
你原来的代码主要存在几个问题:
- 内部定义的
sumTrips、sumSales、sumPrice三个函数仅做了定义,没有实际调用,无法拿到三个字段的总和值 - 三次单独执行SELECT查询,会增加不必要的数据库交互开销
- 没有事务提交逻辑,插入数据到Points表的操作不会实际生效
- 资源关闭逻辑没有做异常兼容,如果代码运行报错,可能会出现游标和连接没有正常关闭的问题
以下是修复并优化后的完整可运行代码:
import mysql.connector from mysql.connector import Error def calculate_and_save_points(): con = None cursor = None try: # 建立数据库连接 con = mysql.connector.connect( host='localhost', database='twitterdb', user='root', password='mypasword', # 替换为你自己的数据库密码 charset='utf8' ) if con.is_connected(): cursor = con.cursor(buffered=True) # 一次查询获取三个字段的总和,减少数据库交互次数 cursor.execute("SELECT SUM(trips), SUM(sales), SUM(price) FROM table_name") # 替换table_name为你实际的表名 sum_trips, sum_sales, sum_price = cursor.fetchone() # 类型转换+空值兼容,避免表内无数据时报错 sum_trips = int(sum_trips) if sum_trips else 0 sum_sales = int(sum_sales) if sum_sales else 0 sum_price = int(sum_price) if sum_price else 0 # 按规则计算积分 trip_points = 20 * sum_trips sales_points = 30 * sum_sales price_points = 40 * sum_price # 插入积分数据到Points表 insert_sql = "INSERT INTO Points (trip_points, sales_points, price_points) VALUES (%s, %s, %s)" cursor.execute(insert_sql, (trip_points, sales_points, price_points)) # 提交事务,MySQL默认开启事务,不提交插入不会持久化到数据库 con.commit() print(f"操作完成,积分计算结果:trip_points={trip_points}, sales_points={sales_points}, price_points={price_points}") except Error as e: print(f"操作出错:{e}") # 出错时回滚事务,避免残留脏数据 if con: con.rollback() finally: # 无论是否出错都释放资源,避免连接泄漏 if cursor: cursor.close() if con and con.is_connected(): con.close() # 调用函数执行逻辑 if __name__ == "__main__": calculate_and_save_points()
本次修改优化点:
- 合并三次单字段求和查询为一次多字段查询,大幅降低数据库交互开销
- 补充事务提交、回滚逻辑,保证数据操作的一致性
- 增加空值兼容处理,避免表内无数据时出现类型转换报错
- 将资源释放逻辑放到finally块中,就算运行过程中报错也能正常关闭游标和数据库连接
使用注意事项:
- 请将代码中的
table_name替换为你实际存储trips、sales、price数据的表名 - 请将
password字段的值替换为你自己的数据库真实密码 - 提前确认
Points表已经创建,三个字段trip_points、sales_points、price_points的字段类型为数值类型(推荐使用INT或BIGINT)
内容的提问来源于stack exchange,提问作者Niusoski
相关产品推荐
相关产品推荐

