使用Python脚本发送信号给MoiaControl

本文介绍了使用Python实现的脚本,通过查询数据库确认待发送事件状态,然后将满足条件的事件发送到MoiaControl,并记录发送结果。脚本包括数据库连接、SQL查询、事件发送及状态更新等功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用Python脚本发送信号给MoiaControl

# -*- coding: utf-8 -*-
import os
import sys
import datetime
import time
import pymysql

# 发送事件日期
runDate = sys.argv[1]

# 定义词典 存储信号发送清单及结果 N-未发送 S-发送成功 F-发送失败
evtResList={'EVT_001': 'N', 'EVT_002': 'N', 'EVT_003': 'N', 'EVT_004': 'N'}

# 先检查确认所有要发送的事件在moia中均已存在 若不存在初始化发送结果为 N-失败
# 连接数据库
try:
    conn_moia = pymysql.connect(host='199.188.166.110', port=3306, user='moia5', password='moia5', db='moia5', charset="utf8")
    # 创建游标对象
    # cursor当前的程序到数据之间连接管道
    cursor_moia = conn_moia.cursor()
except Exception as e:
    print('数据库链接错误', e)
    exit(1)
for key, value in evtResList.items():
    try:
        # 组装sql语句 查询未发送清单中的作业是否已经成功
        sql_evt_judge = '''select count(*)
        from t04_evt_glob_info
        where evt_name='%s'
        ''' % key
        # 执行sql语句
        cursor_moia.execute(sql_evt_judge)
        # sql提交
        conn_moia.commit()
    except Exception as e:
        print('数据库操作失败', e)
        exit(2)
    # 处理结果集
    # 获取所有数据
    res_sql_evt_judge = cursor_moia.fetchall()
    for item in res_sql_evt_judge:
        if item[0] != 1:
            print("事件在moia中不存在, 默认失败:",key)
            sys.stdout.flush()
            evtResList[key]='F'
try:
    # 关闭所有的连接
    # 关闭游标
    cursor_moia.close()
    # 关闭数据库
    conn_moia.close()
except Exception as e:
    print('数据库关闭失败:', e)
    exit(3)

# 未发送事件清单 初始值和待发送清单一致
evtNo=[]
for key, value in evtResList.items():
    if value == 'N':
        evtNo.append(key)

# 开始循环判断发送事件至moia
while 1==1:
    # 转换未发送事件清单为字符串
    noList = "','".join(evtNo)
    # 连接数据库
    try:
        conn_send_list = pymysql.connect(host='199.188.166.110', port=3306, user='moia5', password='moia5', db='zhaoty', charset="utf8")
        # 创建游标对象
        # cursor当前的程序到数据之间连接管道
        cursor_send_list = conn_send_list.cursor()
    except Exception as e:
        print('数据库链接错误', e)
        exit(1)
    try:
        # 组装sql语句 查询未发送清单中的作业是否已经成功
        sql_send_list = '''select name,date
        from zhaoty_test
        where state='1' and date='%s' and name in ('%s')
        ''' % (runDate,noList)
        # 执行sql语句
        cursor_send_list.execute(sql_send_list)
        # sql提交
        conn_send_list.commit()
    except Exception as e:
        print('数据库操作失败', e)
        exit(2)
    try:
        # 关闭所有的连接
        # 关闭游标
        cursor_send_list.close()
        # 关闭数据库
        conn_send_list.close()
    except Exception as e:
        print('数据库关闭失败:', e)
        exit(3)

    # 连接数据库
    try:
        conn_moia = pymysql.connect(host='199.188.166.110', port=3306, user='moia5', password='moia5', db='moia5', charset="utf8")
        # 创建游标对象
        # cursor当前的程序到数据之间连接管道
        cursor_moia = conn_moia.cursor()
    except Exception as e:
        print('数据库链接错误', e)
        exit(1)
    # 处理结果集
    # 获取所有数据
    res_send_list = cursor_send_list.fetchall()
    print("本次循环有 %s 个事件满足发送条件, 需要发送至MOIA" % len(res_send_list))
    for each in res_send_list:
        evt_name=each[0]
        evt_date=each[1]
        print("事件名称:",each[0],"事件日期:",each[1])
        # print("发送事件命令......")
        val = os.system('echo "22229061|{evt_name}|{evt_date}|00000|1"|ncat 199.188.166.110 57501'.format(evt_name=evt_name,evt_date=evt_date))
        sys.stdout.flush()
        # 组装sql语句
        sql_evt_stat = '''select count(*) 
        -- evt_info.evt_name,evt_stat.evt_date
        from t04_evt_src_stat evt_stat,t04_evt_glob_info evt_info
        where evt_stat.evt_id=evt_info.evt_id and evt_stat.evt_stat='8001' and evt_stat.evt_date=%s and evt_info.evt_name=%s
        '''
        # 执行sql语句
        cursor_moia.execute(sql_evt_stat,[evt_date,evt_name])
        # sql提交
        conn_moia.commit()
        # 处理结果集
        # 获取所有数据
        res_evt_stat = cursor_moia.fetchall()
        for each in res_evt_stat:
            evt_res = each[0]
        if evt_res == 0:
            print("发送失败","事件名称:",evt_name,"事件日期:",evt_date)
            sys.stdout.flush()
            evtResList[evt_name]='F'
        else :
            print("发送成功", "事件名称:", evt_name, "事件日期:", evt_date)
            sys.stdout.flush()
            evtResList[evt_name] = 'S'
    try:
        # 关闭所有的连接
        # 关闭游标
        cursor_moia.close()
        # 关闭数据库
        conn_moia.close()
    except Exception as e:
        print('数据库关闭失败:', e)
        exit(3)
    # 遍历发送结果词典 确认信号是否全部发送完成以及发送结果
    # 初始化未发送事件清单重新记录
    evtNo = []
    # 发送成功清单
    evtSucc = []
    # 发送失败清单
    evtFail = []
    for key, value in evtResList.items():
        if value == 'N':
            evtNo.append(key)
        if value == 'S':
            evtSucc.append(key)
        if value == 'F':
            evtFail.append(key)
    print("信号暂未发送个数:", len(evtNo), "信号发送成功个数:", len(evtSucc), "信号发送失败个数:", len(evtFail))
    sys.stdout.flush()
    # 循环结束判断条件 所有信号均已发送一遍
    if len(evtNo)==0:
        break
    else:
        stime=5
        print(datetime.datetime.now(),"本次循环结束 休眠%s秒" % stime)
        sys.stdout.flush()
        time.sleep(stime)

# 最终执行结果判断
if len(evtFail)!=0:
    print("全部信号发送完成, 其中发送成功个数:%s, 发送失败个数:%s, 请检查!" % (len(evtSucc), len(evtFail)))
    print("发送失败事件清单如下:")
    for item in evtFail:
        print(item)
    exit(9)
else:
    print("全部信号发送完成, 发送成功个数:%s !" % len(evtSucc))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值