python之便携式mysql类和tornado mysql长链接
mymysql.py
class MyMysql2(object):
def __init__(self,
host = '',
user = '',
passwd = '',
db = '',
port = 3306,
charset= 'utf8'):
self.host = host
self.user = user
self.passwd = passwd
self.db = db
self.port = port
self.charset= charset
self.conn = None
self.connet() def connet(self):
try:
self.conn = pymysql.connect(host=self.host,
user=self.user,
passwd=self.passwd,
port=int(self.port) ,
database=self.db,
charset=self.charset,
cursorclass = pymysql.cursors.DictCursor)
return True
except Exception as e:
print(e)
return False def _reConn (self,num = 2,stime = 1):
_number = 0
_status = True
while _status and _number <= num:
try:
self.conn.ping() #cping 校验连接是否异常
_status = False
except:
if self.connet()==True: #重新连接,成功退出
_status = False
break
_number +=1
time.sleep(stime) #连接不成功,休眠3秒钟,继续循环,知道成功或重试次数结束
if _status == True:
return (False,'数据库连接失败')
else:
return (True,'数据库连接成功')
def query (self, sql_list):
try:
ret=self._reConn()
if ret[0] == False:
return ret
self.cur = self.conn.cursor()
for sql_str in sql_list:
self.count_nb=self.cur.execute(sql_str)
self.result = self.cur.fetchall()
self.conn.commit()
self.cur.close ()
self.conn.close()
return (True,self.result,self.count_nb)
except Exception as e:
return (False,[e.args[1]]) def close (self): self.conn.close()
调用:
myconn = MyMysql2('1.1.1.1', 'user', 'password', 'database', 3308)
ret=myconn.query(['select * from user'])
tornado之mysql长链接
import tornado.ioloop
import tornado.web
import requests
import json
import os
import time
from tornado import httpserver
import tornado.options
from tornado.options import options , define
from datetime import datetime
import pymysql
from pymysql.cursors import DictCursor as DicCur def myget(url):
ret = requests.get(url=url)
return ret.json() def mypost(url,data):
data=json.dumps(data)
ret = requests.post(url, data=data)
return ret.json() #基本handler
class BaseHandler(tornado.web.RequestHandler):
def get_user_ip(self):
if 'X-Real-Ip' in dict(self.request.headers):
user_ip=dict(self.request.headers)['X-Real-Ip']
elif 'X-Forwarded-For' in dict(self.request.headers):
user_ip = dict(self.request.headers)['X-Forwarded-For']
else:
user_ip=self.request.remote_ip
return user_ip
# 记录日志:
def on_finish(self):
method = self.request.method
host = self.request.host
remote_ip = self.get_user_ip()
uri = self.request.uri
version = self.request.version
time_ = datetime.now().strftime("%Y-%m-%d_%H:%M:%S")
data_dic = self.request.arguments
msg = {}
for k, v in data_dic.items():
msg[k] = v[0].decode().strip()
if 'password' in msg:
msg['password'] = "***"
if method == "GET":
ret_msg = {
'date_time': time_,
'request_url': str(uri).split('?')[0],
'method': method,
'host': host,
'remote_ip': remote_ip,
'version': version,
'data_msg': msg,
}
else:
ret_msg = {
'date_time': time_,
'request_url': uri,
'method': method,
'host': host,
'remote_ip': remote_ip,
'version': version,
'data_msg': msg,
}
log_str='%s %s %s %s %s'%(ret_msg['date_time'],ret_msg['method'],ret_msg['version'],ret_msg['host'],ret_msg['request_url'])
applog_file = os.path.join(os.path.dirname(__file__), 'access.log')
with open(applog_file, 'a+') as f:
f.write("%s\n" % log_str) def get_mysql_conn(self):
conn_count=1
for i in range(5):
try:
if not self.application.mysql_conn:
pymysql_config = self.application.pymysql_config
#print(pymysql_config)
self.application.mysql_conn=pymysql.connect(**pymysql_config)
else:
self.application.mysql_conn.ping()
return (True,self.application.mysql_conn)
except Exception as e:
#print(e)
time.sleep(2)
conn_count+=1
print("mysql conn retyr: %s" % conn_count)
if conn_count == 6:
return (False,str(e)) def do_mysql_query(self,query_list):
'''
注意:
query_list可以传入多个sql一起执行
query_list期望格式: [[sql1,args_list1],[sql2,args_list2]]
本方法的return有两种情况:
(1) (True,result_last,rows_last)
result_last和rows_last,只能反映最后一个语句的返回情况(如果所有语句都没出错的话)
(2) (False,str(e),0)
如果有任意一条语句出错,返回的就是第一条出错的语句的执行结果;
如果有任意一条语句出错,所有语句的执行都不会成功;
'''
cur_conn=self.get_mysql_conn()
if not cur_conn[0]:
return (False,cur_conn[1],0)
try:
cur_conn=cur_conn[1]
with cur_conn.cursor() as cur:
cur.execute("SET NAMES utf8mb4")
cur.execute("SET AUTOCOMMIT = 0")
for sql_argslist in query_list:
cur.execute(sql_argslist[0],sql_argslist[1])
cur_conn.commit()
rows_last = cur.rowcount
result_last = cur.fetchall()
if not result_last:
result_last=[]
return (True,result_last,rows_last)
########################################
except Exception as e:
cur_conn.rollback()
if cur: cur.close()
return (False,str(e),0) #定义一个类继承application
class MyApplication(tornado.web.Application):
def __init__(self):
pymysql_config = {}
pymysql_config['port'] = 3306
pymysql_config['host'] = '1.1.1.1'
pymysql_config['user'] = 'user'
pymysql_config['password'] = 'pass'
pymysql_config['db'] = 'user'
pymysql_config['charset'] = 'utf8mb4'
pymysql_config['cursorclass'] = DicCur self.pymysql_config=pymysql_config
self.mysql_conn = False
tornado.web.Application.__init__(self, handlers=handlerSettings)
#可以添加debug=debug,xsrf_cookies=xsrf_cookies,**settings class avatarUpdataHandler(BaseHandler):
def get(self, *args, **kwargs):
ret=self.do_mysql_query([['select * from mysql;',()]])
print(ret)
self.write('hellow word') if __name__ == "__main__": define("port", default=8899,help="port 8899", type=int) handlerSettings=[
(r"/avatar", avatarUpdataHandler),
]
app = MyApplication() http_server = tornado.httpserver.HTTPServer(app)
http_server.listen(options.port)
# http_server.start(5)
http_server.start(1)
tornado.ioloop.IOLoop.instance().start()
python之便携式mysql类和tornado mysql长链接的更多相关文章
- Centos搭建Python+Nginx+Tornado+Mysql环境[转载]
Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行.由俄罗斯的程序设计师Igor Sysoev所开发,供俄国大型的入 ...
- python【第十二篇】Mysql基础
内容: 1.数据库介绍及MySQL简介 2.MySQL基本操作 1 数据库介绍 1.1什么是数据库? 数据库(Database)是按照数据结构来组织.存储和管理数据的仓库,每个数据库都有一个或多个不同 ...
- Python与数据库[1] -> 数据库接口/DB-API[1] -> MySQL 适配器
MySQL适配器 / MySQL Adapter MySQL是一种关系型数据库,下面主要介绍利用如何利用Python的MySQL适配器来对MySQL进行操作,其余内容可参考文末相关阅读. 1 MySQ ...
- 完善ecshop的mysql类
前篇文章中,我提及到了如何<提取ecshop的mysql类>.但是没有数据库前缀的写法 废话不说,上步骤(目录结构请参考提取ecshop的mysql类) 修改connfig.php为 &l ...
- 提取ecshop的mysql类
在下一篇文章中,我还将介绍如何完善ecshop的mysql类,使用ecshop的数据库前缀 下载ecshop后,解压缩,进入目录upload/includes,复制里面的cls_mysql.php放进 ...
- php四个常用类封装 :MySQL类、 分页类、缩略图类、上传类;;分页例子;
Mysql类 <?php /** * Mysql类 */ class Mysql{ private static $link = null;//数据库连接 /** * 私有的构造方法 */ pr ...
- 简单的php Mysql类(查询 删除 更新)
php Mysql类一般都包括了几乎我们常用的数据库操作方法,这里只提供了查询 删除 更新三种操作,算不是很全只是一个简单的数据库查询类了. 代码如下 复制代码 class mysql { ...
- python执行shell获取硬件参数写入mysql
最近要获取服务器各种参数,包括cpu.内存.磁盘.型号等信息.试用了Hyperic HQ.Nagios和Snmp,它们功能都挺强大的,但是于需求不是太符,亦或者太heavy. 于是乎想到用python ...
- python py_innodb_page_info.py -v /usr/local/var/mysql/ibdata1
mylib.py #encoding=utf-8 import os import include from include import * TABLESPACE_NAME='D:\\mysql_d ...
随机推荐
- 解决N个人过桥时间最短问题(Java版本)
[问题描述] n个人要晚上过桥,在任何时候最多两个人一组过桥,每组要有一只手电筒.在这n个人中只有一个手电筒能用,因此要安排以某种往返的方式来返还手电筒,使更多的人可以过桥. 注意:每个人的过桥速 ...
- pytorch 创建tensor的几种方法
tensor默认是不求梯度的,对应的requires_grad是False. 1.指定数值初始化 import torch #创建一个tensor,其中shape为[2] tensor=torch.T ...
- day74_10_21 三大认证
一.权限六表. 一般在django中,基于用户权限访问控制的认证是RBAC(Role-Based Access Control) 还有一些基于auth的认证规则. Django框架采用的是RBAC认证 ...
- Xmind最新的安装与破解教程
参考链接:https://www.jianshu.com/p/e1693dad4dde Tips: hosts文件的默认位置:C:\Windows\System32\drivers\etc
- day8_对象的交互
#!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2019/7/14 15:07 # @Author : 大坏男孩 # @File : d ...
- Vue 中的 子组件 给 父组件 传值
子组件的某一个事件(sendData)内部,通过this.$emit('事件名', 传递的值)传递数据父组件在调用子组件的地方,绑定了子组件自定义的 事件名(change-data) 定义父组件的地方 ...
- 一、man、系统工作、系统检测命令
目录 一.man命令 (一)常用按键 (二)结构意义 二.常用系统工作命令 (一) echo (二)date (三)reboot (四)powoff (五)wget (六)ps (七)top (八)p ...
- BZOJ1688 「USACO05OPEN」Disease Manangement 背包+状压DP
问题描述 BZOJ1688 题解 背包,在转移过程中使用状压. \(\mathrm{Code}\) #include<bits/stdc++.h> using namespace std; ...
- [LOJ 2721][UOJ 396][BZOJ 5418][NOI 2018]屠龙勇士
[LOJ 2721][UOJ 396][BZOJ 5418][NOI 2018]屠龙勇士 题意 题面好啰嗦啊直接粘LOJ题面好了 小 D 最近在网上发现了一款小游戏.游戏的规则如下: 游戏的目标是按照 ...
- mysql小知识点汇总---(时间与时间戳的转换, 修改mysql用户名密码, navicate 导入sql文件报错 1153)
1. 时间与时间戳的转换 1.1 时间戳转时间 FROM_UNIXTIME(add_time, '%Y-%m-%d') 1.2 时间转时间戳 UNIX_TIMESTAMP('2015-04-29') ...