qianan_wave.py 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. import logging
  2. from datetime import datetime, timedelta
  3. from pathlib import Path
  4. import pymysql
  5. import redis
  6. # -------------------------- 日志配置 --------------------------
  7. # 创建日志目录(如果不存在)
  8. log_dir = Path("/data/logs/wave_data")
  9. log_dir.mkdir(exist_ok=True)
  10. # 配置日志格式和输出
  11. logging.basicConfig(
  12. level=logging.INFO, # 日志级别:DEBUG/INFO/WARNING/ERROR/CRITICAL
  13. format="%(asctime)s - %(name)s - %(levelname)s - %(message)s", # 日志格式
  14. handlers=[
  15. # 输出到文件(按日期命名,编码UTF-8避免中文乱码)
  16. logging.FileHandler(log_dir / f"{datetime.now().strftime('%Y%m%d')}.log", encoding="utf-8"),
  17. # 同时输出到控制台
  18. logging.StreamHandler()
  19. ]
  20. )
  21. logger = logging.getLogger("WaveData") # 日志器名称,便于区分不同模块
  22. # -------------------------- 配置信息 --------------------------
  23. # Redis 配置
  24. REDIS_CONFIG = {
  25. 'host': 'localhost',
  26. 'port': 6379,
  27. 'db': 10,
  28. 'password': '123456',
  29. 'decode_responses': True # 自动将返回值解码为字符串,避免字节串处理
  30. }
  31. # MySQL 配置
  32. MYSQL_CONFIG = {
  33. 'host': '127.0.0.1',
  34. 'port': 4000,
  35. 'user': 'root',
  36. 'password': 'admin123456',
  37. 'database': 'energy_data_prod',
  38. 'charset': 'utf8mb4'
  39. }
  40. now = datetime.now()
  41. last_hour = now - timedelta(hours=1)
  42. FILE_PATH = f"/data/skf-data/National Grid/乾安风电场/{last_hour.year}/{str(last_hour.month).zfill(2)}{str(last_hour.day).zfill(2)}/{str(last_hour.hour).zfill(2)}"
  43. # -------------------------- 核心逻辑 --------------------------
  44. def main():
  45. target_key = f"energy:skf:shake:{last_hour.strftime('%Y%m%d%H')}"
  46. logger.info(f"开始处理任务,目标 Redis Key:{target_key}")
  47. redis_conn = None
  48. mysql_conn = None
  49. mysql_cursor = None
  50. try:
  51. # 2. 连接 Redis 并检查 Key 是否存在
  52. redis_conn = redis.Redis(**REDIS_CONFIG)
  53. # 先判断 Key 是否存在
  54. if not redis_conn.exists(target_key):
  55. logger.warning(f"Redis Key {target_key} 不存在,跳过后续操作")
  56. return # 直接退出,不执行后续逻辑
  57. # 3. 获取 Key 的值并判断是否等于 '1'
  58. value = redis_conn.get(target_key)
  59. logger.info(f"Redis Key {target_key} 的值为:{value}")
  60. if value == '1':
  61. # 3.1 删除 Redis 中的目标 Key
  62. redis_conn.delete(target_key)
  63. logger.info(f"已删除 Redis Key:{target_key}")
  64. # 3.2 连接 MySQL 并插入数据
  65. mysql_conn = pymysql.connect(**MYSQL_CONFIG)
  66. mysql_cursor = mysql_conn.cursor()
  67. # 定义插入语句(参数化查询,避免 SQL 注入)
  68. insert_sql = """
  69. INSERT INTO `data_transfer` (
  70. `task_name`, `wind_farm_code`, `wind_farm_name`,
  71. `transfer_type`, `read_dir`, `data_collector`,
  72. `transfer_status`, `trans_sys_status`
  73. ) VALUES ( %s, 'WOF043800107', '乾安一期', 'wave', %s, '系统', -1, -1);
  74. """
  75. # 构造插入参数
  76. task_name = f"自动-{last_hour.strftime('%Y-%m-%d %H')}"
  77. read_dir = FILE_PATH
  78. # 执行插入
  79. mysql_cursor.execute(insert_sql, (task_name, read_dir))
  80. mysql_conn.commit()
  81. logger.info(f"成功向 MySQL 插入记录:任务名称={task_name},读取目录={read_dir}")
  82. else:
  83. logger.warning(f"Redis Key {target_key} 的值不是 '1'(当前值:{value}),跳过插入操作")
  84. except redis.RedisError as e:
  85. logger.error(f"Redis 操作出错:{str(e)}", exc_info=True) # exc_info=True 打印详细异常栈
  86. except pymysql.MySQLError as e:
  87. logger.error(f"MySQL 操作出错:{str(e)}", exc_info=True)
  88. # 插入失败时回滚 MySQL 事务
  89. if mysql_conn:
  90. mysql_conn.rollback()
  91. except Exception as e:
  92. logger.error(f"未知错误:{str(e)}", exc_info=True)
  93. finally:
  94. # 确保所有连接关闭
  95. # 关闭 MySQL 游标和连接
  96. if mysql_cursor:
  97. mysql_cursor.close()
  98. if mysql_conn:
  99. mysql_conn.close()
  100. # 关闭 Redis 连接
  101. if redis_conn:
  102. redis_conn.close()
  103. logger.info("任务处理完成,所有连接已关闭")
  104. if __name__ == "__main__":
  105. main()