""" 数据自动清洗脚本 - 每次服务启动时自动执行 """ import pymysql def clean(): conn = pymysql.connect(host="127.0.0.1", port=3306, user="dy_app", password="dy_data_2026", database="dy_data", charset="utf8mb4") cur = conn.cursor() total = 0 # 清理规则1:删除脏数据行 delete_rules = [ ("UPPER(TRIM(货品编号)) IN ('NA', 'N/A', '合计', '合计:') OR TRIM(货品编号) = ''", '出库汇总/占位行'), ("货品名称 = 'NA'", '货品名称为NA'), ("货品名称 = ''", '货品名称为空'), ("货品编号 = '合计:'", '合计行'), ("仓库 LIKE '%虚拟仓%'", '仓库含虚拟仓'), ("品牌 LIKE '%潘思宇代发%'", '潘思宇代发品牌(无效数据)'), ] for condition, label in delete_rules: cur.execute(f"DELETE FROM daily_outbound WHERE {condition}") deleted = cur.rowcount if deleted > 0: print(f" 🗑️ {label}: 删除 {deleted} 条") total += deleted # 清理库存明细中的报表汇总行/占位编码 cur.execute(""" DELETE FROM inventory_detail WHERE UPPER(TRIM(product_code)) IN ('NA', 'N/A', '合计', '合计:') OR TRIM(product_code) = '' """) inventory_deleted = cur.rowcount if inventory_deleted > 0: print(f" 🗑️ 库存汇总/占位行: 删除 {inventory_deleted} 条") total += inventory_deleted # 清理规则2:修复负值/异常值(整数溢出导致的负数) cur.execute(""" UPDATE daily_outbound SET 货品数量 = 0 WHERE 货品数量 < -1000000 OR 货品数量 > 10000000 """) overflow = cur.rowcount if overflow > 0: print(f" 🛠️ 异常数值修复: {overflow} 条(整数溢出)") # 清理规则3:修复字段格式(去除 ="xxx" 的脏包裹) cur.execute(""" UPDATE daily_outbound SET 仓库 = TRIM(BOTH '"' FROM TRIM(LEADING '=' FROM 仓库)) WHERE 仓库 LIKE '=%' """) fixed = cur.rowcount if fixed > 0: print(f" 🛠️ 仓库格式修复: {fixed} 条(=号包裹)") cur.execute(""" UPDATE daily_outbound SET 店铺 = TRIM(BOTH '"' FROM TRIM(LEADING '=' FROM 店铺)) WHERE 店铺 LIKE '=%' """) fixed2 = cur.rowcount if fixed2 > 0: print(f" 🛠️ 店铺格式修复: {fixed2} 条(=号包裹)") conn.commit() if total > 0 or fixed > 0 or fixed2 > 0: print(f" ✅ 本次清理 {total} 条脏数据,修复 {fixed + fixed2} 条格式") cur.close() conn.close() return total if __name__ == "__main__": print("🔍 运行数据自动清洗...") clean() print(" 完成")