Python实现的查询mysql数据库并通过邮件发送信息功能


Posted in Python onMay 17, 2018

本文实例讲述了Python实现的查询mysql数据库并通过邮件发送信息功能。分享给大家供大家参考,具体如下:

这里使用Python查询mysql数据库,并通过邮件发送宕机信息。

Python代码如下:

#-*- coding: UTF-8 -*-
#!/usr/bin/env python
'''''
author:qlzhong
Created on 2015-6-29
征途宕机日志统计汇总
'''
import MySQLdb
import time
import datetime
import smtplib
from email.mime.text import MIMEText
mailto_list=["mail@mail.com"]
#mailto_list=["zhongqilong@ztgame.com"]
mail_host="smtp.qq.com" #设置服务器
mail_user=""  #用户名
mail_pass=""  #口令
mail_postfix="" #发件箱的后缀
def send_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()
    return True
  except Exception, e:
    print str(e)
    return False
class MySQLHelper:
  #配置数据库信息并连接
  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("==================connect success====================")
    except MySQLdb.Error as e:
      print("Mysql Error %d: %s" % (e.args[0], e.args[1]))
  #取出需要统计的数据库名称
  def db_name(self):
    un_db_name = ['information_schema','cz','ecshop','edutone','gz','mysql','newparent','parent','performance_schema','test','xx','yyhd']
    name = []
    try:
      self.cur.execute('show databases')
      for row in self.cur.fetchall():
        for i in row:
          if i not in un_db_name:
            name.append(i)
      return name
    except MySQLdb.Error as e:
      print("Mysql Error %d: %s" % (e.args[0], e.args[1]))
  #指定查询的数据库名称
  def selectDb(self,db):
    try:
      self.conn.select_db(db)
    except MySQLdb.Error as e:
      print("Mysql Error %d: %s" % (e.args[0], e.args[1]))
  #使用该语句来直接查询昨天和今天的差异
  def monion_today_yesddiff(self, today, yestoday):
    try:
      strresult = ""
      strsql = 'SELECT address, charversion, sum(today) as today, sum(yesterday) as yesterday '
      strsql += 'FROM (SELECT address, "" as today, tmp as yesterday, charversion FROM ( SELECT count(*) As tmp, address, charversion From `' + yestoday
      strsql += '` WHERE charversion like \'1.0.0.3%\' GROUP BY address) As TEST WHERE tmp>=50 '
      strsql += ' union all '
      strsql += 'SELECT address, tmp as today, "" as yesterday, charversion FROM (SELECT count(*) As tmp, address, charversion From `'
      strsql += today
      strsql += '` WHERE charversion like \'1.0.0.3%\' GROUP BY address) As TEST WHERE tmp>=50 ) As Diff GROUP BY address, charversion'
      print(strsql + "\n")
      self.cur.execute(strsql)
      name_list = [tuple[0] for tuple in self.cur.description]
      strresult += str(name_list) + "\n"
      # for row in self.cur.fetchall():
      #   return row
      s = self.cur.fetchall()
      todaynum = 0
      yestodaynum = 0
      for col in s:
        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"
      return strresult
    except MySQLdb.Error as e:
      print("Mysql Error:%s\n" %(e))
  def close(self):
    self.cur.close()
    self.conn.close()
  todayrang = 0;
  yestodayrang = 0;
  #按照范围查询
  def monion_rang_today_yesddiff(self, today, yestoday, num1, num2):
    try:
      strresult = ""
      strsql = 'SELECT sum(today) as today, sum(yesterday) as yesterday FROM (SELECT "" as today, tmp as yesterday FROM ( SELECT count(*) As tmp From `' + yestoday
      strsql += '` WHERE charversion like \'1.0.0.3%\' GROUP BY address) As TEST WHERE tmp<' + str(num2) + ' AND tmp>=' + str(num1) + ' union all '
      strsql += 'SELECT tmp as today, "" as yesterday FROM (SELECT count(*) As tmp From `' + today + '` WHERE charversion like \'1.0.0.3%\'  GROUP BY address) As TEST WHERE tmp<' + str(num2) + ' AND tmp>=' + str(num1) + ' ) As Diff'
      print(strsql + "\n")
      self.cur.execute(strsql)
      name_list = [tuple[0] for tuple in self.cur.description]
      #strresult += str(name_list) + "\n"
      # for row in self.cur.fetchall():
      #   return row
      s = self.cur.fetchall()
      todaynum = 0
      yestodaynum = 0
      for col in s:
        strresult += str(num1) + " <= tmp < " + str(num2) + "  " + str(col[0]) + " " + str(col[1]) + "\n"
        self.todayrang += int(col[0])
        self.yestodayrang += int(col[1])
      return strresult
    except MySQLdb.Error as e:
      print("Mysql Error:%s\n" %(e))
  def close(self):
    self.cur.close()
    self.conn.close()
  #宕机数地址50以下最多的版本
  def monion_rang_today_diff(self, today, num):
    try:
      strresult = ""
      strsql = 'SELECT charversion, sum(today) as today FROM (SELECT tmp as today, "" as yesterday, charversion FROM (SELECT count(*) As tmp, charversion From `' + today
      strsql += '` WHERE charversion like \'1.0.0.3%\'  GROUP BY address) As TEST WHERE tmp< ' + str(num) + ') As Diff GROUP BY charversion'
      print(strsql + "\n")
      self.cur.execute(strsql)
      name_list = [tuple[0] for tuple in self.cur.description]
      #strresult += str(name_list) + "\n"
      # for row in self.cur.fetchall():
      #   return row
      s = self.cur.fetchall()
      for col in s:
        strresult += str(col[0]) + " " + str(col[1]) + "\n"
      return strresult
    except MySQLdb.Error as e:
      print("Mysql Error:%s\n" %(e))
  def close(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 + "table name: 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)
  if send_mail(mailto_list,"征途客户端宕机日志统计",textbody):
    print "发送成功"
  else:
    print "发送失败"
  dbHelper.close()

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
Python编写检测数据库SA用户的方法
Jul 11 Python
Python解释执行原理分析
Aug 22 Python
给Python的Django框架下搭建的BLOG添加RSS功能的教程
Apr 08 Python
python选择排序算法实例总结
Jul 01 Python
Python 列表(List) 的三种遍历方法实例 详解
Apr 15 Python
彻底理解Python list切片原理
Oct 27 Python
动态规划之矩阵连乘问题Python实现方法
Nov 27 Python
python基于递归解决背包问题详解
Jul 03 Python
Python调用scp向服务器上传文件示例
Dec 22 Python
通过 Python 和 OpenCV 实现目标数量监控
Jan 05 Python
Django {{ MEDIA_URL }}无法显示图片的解决方式
Apr 07 Python
Django --Xadmin 判断登录者身份实例
Jul 03 Python
Python实现读取txt文件并转换为excel的方法示例
May 17 #Python
cmd运行python文件时对结果进行保存的方法
May 16 #Python
Python基于lxml模块解析html获取页面内所有叶子节点xpath路径功能示例
May 16 #Python
Python使用Dijkstra算法实现求解图中最短路径距离问题详解
May 16 #Python
Python基于Floyd算法求解最短路径距离问题实例详解
May 16 #Python
Python使用selenium实现网页用户名 密码 验证码自动登录功能
May 16 #Python
Selenium 模拟浏览器动态加载页面的实现方法
May 16 #Python
You might like
php数组一对一替换实现代码
2012/08/31 PHP
linux实现php定时执行cron任务详解
2013/12/24 PHP
PHP字符串逆序排列实现方法小结【strrev函数,二分法,循环法,递归法】
2017/01/13 PHP
node.js中的fs.readlinkSync方法使用说明
2014/12/17 Javascript
JavaScript设置获取和设置属性的方法
2015/03/04 Javascript
javascript实时获取鼠标坐标值并显示的方法
2015/04/30 Javascript
ionic隐藏tabs的方法
2016/08/29 Javascript
Vue.js每天必学之过渡与动画
2016/09/06 Javascript
利用策略模式与装饰模式扩展JavaScript表单验证功能
2017/02/14 Javascript
详谈commonjs模块与es6模块的区别
2017/10/18 Javascript
简单的React SSR服务器渲染实现
2018/12/11 Javascript
Vue中使用canvas方法总结
2019/02/12 Javascript
浅谈express.js框架中间件(middleware)
2019/04/07 Javascript
Vue源码学习之关于对Array的数据侦听实现
2019/04/23 Javascript
详解小程序用户登录状态检查与更新实例
2019/05/15 Javascript
js实现适配移动端的拖动效果
2020/01/13 Javascript
利用React高阶组件实现一个面包屑导航的示例
2020/08/23 Javascript
vue v-on:click传递动态参数的步骤
2020/09/11 Javascript
详解Python3中的Sequence type的使用
2015/08/01 Python
Python打印输出数组中全部元素
2018/03/13 Python
python寻找list中最大值、最小值并返回其所在位置的方法
2018/06/27 Python
numpy库ndarray多维数组的维度变换方法(reshape、resize、swapaxes、flatten)
2020/04/28 Python
python3.6中anaconda安装sklearn踩坑实录
2020/07/28 Python
Tensorflow使用Anaconda、pycharm安装记录
2020/07/29 Python
python中watchdog文件监控与检测上传功能
2020/10/30 Python
德国药房apodiscounter中文官网:德国排名前三的网上药店
2019/06/03 全球购物
英语专业个人求职自荐信
2013/09/21 职场文书
教学器材管理制度
2014/01/26 职场文书
大学生军训自我鉴定范文
2014/09/18 职场文书
小学一年级学生评语大全
2014/12/25 职场文书
2015年助理政工师工作总结
2015/05/26 职场文书
调研报告的主要写法
2019/04/18 职场文书
2019年二手房买卖合同范本
2019/10/14 职场文书
python 中的jieba分词库
2021/11/23 Python
德劲DE1102数字调谐收音机机评
2022/04/07 无线电
Win11 Dev 预览版25174.1000发布 (附更新修复内容汇总)
2022/08/05 数码科技