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 类与元类的深度挖掘 II【经验】
May 06 Python
Python实现霍夫圆和椭圆变换代码详解
Jan 12 Python
python爬虫之验证码篇3-滑动验证码识别技术
Apr 11 Python
python实现对服务器脚本敏感信息的加密解密功能
Aug 13 Python
Python利用matplotlib绘制约数个数统计图示例
Nov 26 Python
使用 tf.nn.dynamic_rnn 展开时间维度方式
Jan 21 Python
Python3+selenium实现cookie免密登录的示例代码
Mar 18 Python
Pytorch高阶OP操作where,gather原理
Apr 30 Python
python_matplotlib改变横坐标和纵坐标上的刻度(ticks)方式
May 16 Python
matplotlib.pyplot.plot()参数使用详解
Jul 28 Python
详解Python牛顿插值法
May 11 Python
Python Parser的用法
May 12 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
session 的生命周期是多长
2006/10/09 PHP
一个高ai的分页函数和一个url函数
2006/10/09 PHP
JSON在PHP中的应用介绍
2012/09/08 PHP
thinkphp5 模型实例化获得数据对象的教程
2019/10/18 PHP
DOM精简教程
2006/10/03 Javascript
js 操作css实现代码
2009/06/11 Javascript
ExtJS 设置级联菜单的默认值
2010/06/13 Javascript
JQuery 文本框回车跳到下一个文本框示例代码
2013/08/30 Javascript
new Date()问题在ie8下面的处理方法
2014/07/31 Javascript
Javascript正则控制文本框只能输入整数或浮点数
2014/09/02 Javascript
jQuery获取剪贴板内容的方法
2016/06/16 Javascript
webpack+vue.js快速入门教程
2016/10/12 Javascript
easyui datebox 时间限制,datebox开始时间限制结束时间,datebox截止日期比起始日期大的实现代码
2017/01/12 Javascript
js获取指定时间的前几秒
2017/04/05 Javascript
了解ESlint和其相关操作小结
2018/05/21 Javascript
深入理解NodeJS 多进程和集群
2018/10/17 NodeJs
vue中用 async/await 来处理异步操作
2020/07/18 Javascript
Vue js with语句原理及用法解析
2020/09/03 Javascript
Python Requests模拟登录实现图书馆座位自动预约
2018/04/27 Python
解决python3 json数据包含中文的读写问题
2018/05/10 Python
python和mysql交互操作实例详解【基于pymysql库】
2019/06/04 Python
python+adb+monkey实现Rom稳定性测试详解
2020/04/23 Python
利用OpenCV中对图像数据进行64F和8U转换的方式
2020/06/03 Python
在pycharm中debug 实时查看数据操作(交互式)
2020/06/09 Python
纯DOM+CSS3实现简单的小风车动画
2016/09/27 HTML / CSS
Coggles美国/加拿大:高级国际时装零售商
2018/10/23 全球购物
KENZO官网:高田贤三在法国创立的品牌
2019/05/16 全球购物
澳大利亚厨房和家用电器购物网站:Bing Lee
2021/01/11 全球购物
药剂学专业应届生自荐信
2013/09/29 职场文书
财务部岗位职责
2013/11/19 职场文书
缴纳养老保险的证明
2014/01/10 职场文书
运动会广播稿300字
2014/01/10 职场文书
初中班主任寄语
2014/04/04 职场文书
市级青年文明号申报材料
2014/05/26 职场文书
担保书怎么写 ?
2019/04/22 职场文书
python 字典和列表嵌套用法详解
2021/06/29 Python