import asyncio import os import sys import logging # 确保项目根目录在 sys.path 中 project_root = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) if project_root not in sys.path: sys.path.append(project_root) from DbKit.Db import Db from Util.RedisKit import RedisKit from sqlalchemy.sql import text from Config.Config import DB_URL # 配置日志 logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s') logger = logging.getLogger("ClearAiTeJiYiChong") async def main(): """ 1. 删除数据库中所有 operator='艾特吉易充' 的记录 2. 删除 Redis 中所有关于艾特吉易充的缓存信息 """ operator = '艾特吉易充' # 1. 数据库清理 logger.info(f"开始清理数据库中 operator='{operator}' 的数据...") db = Db(db_url=DB_URL) await db.init_db() try: async with db.AsyncSessionLocal() as session: async with session.begin(): # 先删除从表记录(通过 station_hash 关联) # 1. t_station_status_scd sql_status = """ DELETE FROM t_station_status_scd WHERE station_hash IN ( SELECT station_hash FROM t_station_profile_scd WHERE operator = :operator ) """ logger.info("正在清理 t_station_status_scd...") result_status = await session.execute(text(sql_status), {"operator": operator}) logger.info(f"t_station_status_scd 已删除 {result_status.rowcount} 行记录。") # 2. t_station_price_schedule_scd sql_price = """ DELETE FROM t_station_price_schedule_scd WHERE station_hash IN ( SELECT station_hash FROM t_station_profile_scd WHERE operator = :operator ) """ logger.info("正在清理 t_station_price_schedule_scd...") result_price = await session.execute(text(sql_price), {"operator": operator}) logger.info(f"t_station_price_schedule_scd 已删除 {result_price.rowcount} 行记录。") # 3. 最后删除主表 t_station_profile_scd sql_profile = "DELETE FROM t_station_profile_scd WHERE operator = :operator" logger.info("正在清理 t_station_profile_scd...") result_profile = await session.execute(text(sql_profile), {"operator": operator}) logger.info(f"t_station_profile_scd 已删除 {result_profile.rowcount} 行记录。") logger.info("数据库记录清理完成。") except Exception as e: logger.error(f"数据库清理失败: {e}") # 2. Redis 清理 logger.info("开始清理 Redis 中的缓存数据...") redis_kit = RedisKit() # 根据 Crawler.py 中的逻辑,key 的模式为 crawled:aite:* pattern = "crawled:aite:*" try: keys = await redis_kit.keys(pattern) if keys: logger.info(f"匹配到 {len(keys)} 个键,正在删除...") await redis_kit.delete(*keys) logger.info("Redis 缓存清理完成。") else: logger.info(f"未匹配到模式为 '{pattern}' 的键。") except Exception as e: logger.error(f"Redis 清理失败: {e}") if __name__ == "__main__": asyncio.run(main())