Python实现的查询mysql数据库并通过邮件发送信息功能
本文实例讲述了Python实现的查询mysql数据库并通过邮件发送信息功能。分享给大家供大家参考,具体如下:
这里使用Python查询mysql数据库,并通过邮件发送宕机信息。
Python代码如下:
#-*-coding:UTF-8-*- #!/usr/bin/envpython ''''' author:qlzhong Createdon2015-6-29 征途宕机日志统计汇总 ''' importMySQLdb importtime importdatetime importsmtplib fromemail.mime.textimportMIMEText mailto_list=["mail@mail.com"] #mailto_list=["zhongqilong@ztgame.com"] mail_host="smtp.qq.com"#设置服务器 mail_user=""#用户名 mail_pass=""#口令 mail_postfix=""#发件箱的后缀 defsend_mail(to_list,sub,content): me="hello"+"<"+mail_user+"@"+mail_postfix+">" msg=MIMEText(content,_subtype='plain',_charset='utf-8') msg['Subject']=sub msg['From']=me msg['To']=";".join(to_list) try: server=smtplib.SMTP() server.connect(mail_host) server.login(mail_user,mail_pass) server.sendmail(me,to_list,msg.as_string()) server.close() returnTrue exceptException,e: printstr(e) returnFalse classMySQLHelper: #配置数据库信息并连接 def__init__(self,host="****",user="****",password="****",port=3306,charset="utf8"): self.host=host self.user=user self.password=password self.port=port self.charset=charset try: self.conn=MySQLdb.connect(host=self.host,user=self.user,passwd=self.password,port=self.port) self.conn.set_character_set(self.charset) self.cur=self.conn.cursor() print("==================connectsuccess====================") exceptMySQLdb.Errorase: print("MysqlError%d:%s"%(e.args[0],e.args[1])) #取出需要统计的数据库名称 defdb_name(self): un_db_name=['information_schema','cz','ecshop','edutone','gz','mysql','newparent','parent','performance_schema','test','xx','yyhd'] name=[] try: self.cur.execute('showdatabases') forrowinself.cur.fetchall(): foriinrow: ifinotinun_db_name: name.append(i) returnname exceptMySQLdb.Errorase: print("MysqlError%d:%s"%(e.args[0],e.args[1])) #指定查询的数据库名称 defselectDb(self,db): try: self.conn.select_db(db) exceptMySQLdb.Errorase: print("MysqlError%d:%s"%(e.args[0],e.args[1])) #使用该语句来直接查询昨天和今天的差异 defmonion_today_yesddiff(self,today,yestoday): try: strresult="" strsql='SELECTaddress,charversion,sum(today)astoday,sum(yesterday)asyesterday' strsql+='FROM(SELECTaddress,""astoday,tmpasyesterday,charversionFROM(SELECTcount(*)Astmp,address,charversionFrom`'+yestoday strsql+='`WHEREcharversionlike\'1.0.0.3%\'GROUPBYaddress)AsTESTWHEREtmp>=50' strsql+='unionall' strsql+='SELECTaddress,tmpastoday,""asyesterday,charversionFROM(SELECTcount(*)Astmp,address,charversionFrom`' strsql+=today strsql+='`WHEREcharversionlike\'1.0.0.3%\'GROUPBYaddress)AsTESTWHEREtmp>=50)AsDiffGROUPBYaddress,charversion' print(strsql+"\n") self.cur.execute(strsql) name_list=[tuple[0]fortupleinself.cur.description] strresult+=str(name_list)+"\n" #forrowinself.cur.fetchall(): #returnrow s=self.cur.fetchall() todaynum=0 yestodaynum=0 forcolins: strresult+=str(col[0])+""+str(col[1])+""+str(col[2])+""+str(col[3])+"\n" todaynum+=int(col[2]) yestodaynum+=int(col[3]) strresult+="今日宕机总数:"+str(todaynum)+"昨日宕机总数:"+str(yestodaynum)+"同昨日相比增加:"+str(todaynum-yestodaynum)+"\n" returnstrresult exceptMySQLdb.Errorase: print("MysqlError:%s\n"%(e)) defclose(self): self.cur.close() self.conn.close() todayrang=0; yestodayrang=0; #按照范围查询 defmonion_rang_today_yesddiff(self,today,yestoday,num1,num2): try: strresult="" strsql='SELECTsum(today)astoday,sum(yesterday)asyesterdayFROM(SELECT""astoday,tmpasyesterdayFROM(SELECTcount(*)AstmpFrom`'+yestoday strsql+='`WHEREcharversionlike\'1.0.0.3%\'GROUPBYaddress)AsTESTWHEREtmp<'+str(num2)+'ANDtmp>='+str(num1)+'unionall' strsql+='SELECTtmpastoday,""asyesterdayFROM(SELECTcount(*)AstmpFrom`'+today+'`WHEREcharversionlike\'1.0.0.3%\'GROUPBYaddress)AsTESTWHEREtmp<'+str(num2)+'ANDtmp>='+str(num1)+')AsDiff' print(strsql+"\n") self.cur.execute(strsql) name_list=[tuple[0]fortupleinself.cur.description] #strresult+=str(name_list)+"\n" #forrowinself.cur.fetchall(): #returnrow s=self.cur.fetchall() todaynum=0 yestodaynum=0 forcolins: strresult+=str(num1)+"<=tmp<"+str(num2)+""+str(col[0])+""+str(col[1])+"\n" self.todayrang+=int(col[0]) self.yestodayrang+=int(col[1]) returnstrresult exceptMySQLdb.Errorase: print("MysqlError:%s\n"%(e)) defclose(self): self.cur.close() self.conn.close() #宕机数地址50以下最多的版本 defmonion_rang_today_diff(self,today,num): try: strresult="" strsql='SELECTcharversion,sum(today)astodayFROM(SELECTtmpastoday,""asyesterday,charversionFROM(SELECTcount(*)Astmp,charversionFrom`'+today strsql+='`WHEREcharversionlike\'1.0.0.3%\'GROUPBYaddress)AsTESTWHEREtmp<'+str(num)+')AsDiffGROUPBYcharversion' print(strsql+"\n") self.cur.execute(strsql) name_list=[tuple[0]fortupleinself.cur.description] #strresult+=str(name_list)+"\n" #forrowinself.cur.fetchall(): #returnrow s=self.cur.fetchall() forcolins: strresult+=str(col[0])+""+str(col[1])+"\n" returnstrresult exceptMySQLdb.Errorase: print("MysqlError:%s\n"%(e)) defclose(self): self.cur.close() self.conn.close() if__name__=='__main__': textbody="" textbody=textbody+"征途宕机日志查询汇总"+"\n" #时间 timenow=datetime.datetime.now() textbody=textbody+"时间:"+timenow.strftime('%Y-%m-%d%H:%M:%S')+"\n" #连接 ipadress="192.168.100.38" port=3306 dbHelper=MySQLHelper(ipadress,"gameerror","errorpasswd",port) textbody=textbody+"服务器地址:"+ipadress+":"+str(port)+"\n" dbHelper.selectDb("GAMEERROR") #操作 dbname=dbHelper.db_name() textbody=textbody+"数据库:"+str(dbname[0])+"\n" time1=timenow+datetime.timedelta(days=-1) time2=timenow+datetime.timedelta(days=-2) strtime1=time1.strftime('%Y%m%d') tabletoday="ErrorDump"+strtime1 strtime2=time2.strftime('%Y%m%d') tableyestoday="ErrorDump"+strtime2 textbody=textbody+"tablename:today:"+tabletoday+"yestoday:"+tableyestoday+"\n" textbody=textbody+"\n昨天和今天的差异宕机地址版本号今天宕机次数昨天宕机次数"+"\n" textbody=textbody+str(dbHelper.monion_today_yesddiff(tabletoday,tableyestoday))+"\n" textbody=textbody+"50以下地址(tmp代表某个宕机地址的个数)今天昨天:"+"\n" textbody=textbody+str(dbHelper.monion_rang_today_yesddiff(tabletoday,tableyestoday,30,50)) textbody=textbody+str(dbHelper.monion_rang_today_yesddiff(tabletoday,tableyestoday,10,30)) textbody=textbody+str(dbHelper.monion_rang_today_yesddiff(tabletoday,tableyestoday,0,10)) textbody=textbody+"50以上地址总和"+"今天:"+str(dbHelper.todayrang)+"昨天:"+str(dbHelper.yestodayrang)+"今天比昨天增加:"+str(dbHelper.todayrang-dbHelper.yestodayrang)+"\n" num=50 textbody=textbody+"\n宕机数地址"+str(num)+"以下最多的版本版本号次数"+"\n" textbody=textbody+str(dbHelper.monion_rang_today_diff(tabletoday,num)) file_object=open('ztdumptip.txt') try: all_the_text=file_object.read() finally: file_object.close() textbody+=all_the_text print(textbody) ifsend_mail(mailto_list,"征途客户端宕机日志统计",textbody): print"发送成功" else: print"发送失败" dbHelper.close()
更多关于Python相关内容感兴趣的读者可查看本站专题:《Python+MySQL数据库程序设计入门教程》、《Python常见数据库操作技巧汇总》、《Python数学运算技巧总结》、《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》及《Python文件与目录操作技巧汇总》
希望本文所述对大家Python程序设计有所帮助。