使用Python删除MySQL表中日期不等于当前日期的行失败如何解决
原因分析及解决方法
以下是导致操作不生效的常见原因和对应修复方案:
核心常见原因
- 未提交事务:Python的MySQL驱动(pymysql/MySQLdb等)默认开启手动事务提交,仅执行
execute语句不会将修改同步到数据库,必须调用连接对象的commit方法才会生效。 - 关键字未转义:
Date属于MySQL保留关键字,作为字段名使用时需要用反引号包裹,避免语法解析异常。 - 字段类型不匹配:如果
Date字段是DATETIME/TIMESTAMP类型,存储有时分秒信息,直接和日期字符串对比会出现匹配偏差,需要先用DATE()函数提取日期部分再比较。 - SQL拼接风险:直接拼接SQL字符串容易出现引号转义错误,还存在SQL注入风险,推荐使用参数化查询写法。
正确实现代码
方案1:使用MySQL内置日期函数(推荐,避免Python和数据库时区不一致问题)
# 注:表名无法参数化,League变量请提前做白名校验避免注入风险 sql = f"DELETE FROM `{League}` WHERE DATE(`Date`) != CURDATE()" mycursor.execute(sql) # 必须执行事务提交 mydb.commit() # mydb为你创建的MySQL连接对象
方案2:使用Python生成的日期参数
import time current_date = time.strftime('%Y-%m-%d') sql = f"DELETE FROM `{League}` WHERE DATE(`Date`) != %s" # 参数化查询,自动处理引号转义 mycursor.execute(sql, (current_date,)) # 提交事务 mydb.commit()
验证方法
执行删除后可通过print(mycursor.rowcount)查看实际删除的行数,确认操作效果。测试阶段建议先把SQL中的DELETE换成SELECT *,确认匹配的行符合预期后再执行删除操作,避免误删数据。
内容的提问来源于stack exchange,提问作者AxelotlZ
相关产品推荐
相关产品推荐

