Python实现的查询mysql数据库并通过邮件发送信息功能
作者:江枫渔火2017 发布时间:2024-01-21 11:51:36
标签:Python,mysql数据库,邮件
本文实例讲述了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程序设计有所帮助。
来源:https://blog.csdn.net/jesse__zhong/article/details/79696171
0
投稿
猜你喜欢
- import time# time模块中包含了许多与时间相关的模块,其中通过time()函数可以获取当前的时间。count = 100pri
- 目录一个不那么方便的解决方案:实战演练网站在线转换Postman今天介绍个神奇的网站!堪称爬虫偷懒的神器!我们在写爬虫,构建网络请求的时候,
- 方法一:mylist = [1,2,2,2,2,3,3,3,4,4,4,4]myset = set(mylist)for item in m
- 代码如下# 爬取网易音乐import requestsfrom bs4 import BeautifulSoupimport urllib.
- 为表和字段取别名阿文之前介绍过MySQL的分组查询、集合函数查询和嵌套子查询,在编写SQL语句时有的地方使用到AS关键字为查询结果中的某一列
- 本文实例为大家分享了Django文件上传与下载的具体代码,供大家参考,具体内容如下文件上传1.新建django项目,创建应用stu: pyt
- 介绍百度aip模块是用于实现百度云与用户接口,简单来说就是使用百度云所拥有的人工智能模块。模块使用pip install baidu-aip
- 学会了FSO提取文件值,也学会了将信息输入到文件中,那下面就再来应用应用下。不知道你有没有这样的习惯:看到一个文件,不自觉的右键选择用记事本
- 实例如下:# -*- coding: utf-8 -*-"""Spyder EditorThis tempor
- 0、什么时候会用到virtualenv?假设系统中的两个应用,其中A应用对库LibFoo的版本要求为1,而B应用对同一个库LibFoo的版本
- 跳表跳表,又叫做跳跃表、跳跃列表,在有序链表的基础上增加了“跳跃”的功能,由William Pugh于1990年发布,设计的初衷是为了取代平
- 不知道您是否留意了,浏览本站时,浏览器右下角有一个标着top的黑色直角三角形,可以点击它返回到正在浏览的网页页眉。当滚动网页时,它的位置一直
- 基于Python2.7的版本环境,Python实现的数据库跨服务器(跨库)迁移, 每以5000条一查询一提交,代码中可以自行更改
- 本文主要介绍Python中,class(类)的装饰器@staticmethod和@classmethod的使用示例代码和它们的区别。1、@s
- 数据库的表Info,表部分结构:Info_Id  
- 可以把本功能写成一个函数,函数的处理过程描述如下:首先调用adodb.connection对象中的openSchema函数,这样会得到一个R
- 很类似java的properties文件xml文件db_config.ini[baseconf]host=127.0.0.1port=330
- 前言Hello!大家好,有好几天没有跟大家见面咯~不知道大家是否在等待《小玩意儿》专栏的更新呢上一篇的文章【老师见打系列】:我只是写了一个自
- 这篇文章主要介绍了如何获取Python简单for循环索引,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的
- 最近没事,写了个在项目经常要取城市或省份名的方法,所以改成了一个类.方便以后调用//****************************