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 ...
随机推荐
- emacs 帮助相关命令
emacs 帮助相关命令 如下表: No. 键盘操作 键盘操作对应的函数 回答的问题 01 ctrl-h c describe-key-briefly 这个按键组合将运行哪个函数 02 ctrl-h ...
- 使用ghpage(github服务)搭建文档网站几种方式
可以通过github提供的ghpage服务来搭建网站,有以下三种方式来实现: 1.文档放在master分支,作为一个子目录. 仓库:https://github.com/Ourpalm/ILRunti ...
- 初学JavaScript正则表达式(四)
字符类 [] 一般情况下正则表达式中一个字符对应字符串一个字符 可以使用元字符 [ ] 来构建一个简单的类 类泛指符合某些特征的对象 例: 'a1b1c1d1'.replace(/[ab ...
- Vue生命周期钩子---2
vue生命周期简介 咱们从上图可以很明显的看出现在vue2.0都包括了哪些生命周期的函数了. 生命周期探究 对于执行顺序和什么时候执行,看上面两个图基本有个了解了.下面我们将结合代码去看看钩子函数的执 ...
- pthread_create线程终止问题
一直以为,程序创建线程,线程运行结束会自动清空资源 最近在一个项目中用到了线程,除去业务逻辑,我把他简化出来是下面这样 //pthread.c 错误demo示例#include <stdio.h ...
- ARM的堆栈方式
当堆栈指针指向最后压入堆栈的数据时,称为满堆栈(Full Stack): 当堆栈指针指向下一个将要放入数据的空位置时,称为空堆栈(Empty Stack): 根据对战的生成方式分为:递增堆栈(Asce ...
- JMeter面试题
1.Jmeter怎么录制脚本,怎么过滤,线程组有哪些内容? jmeter可以使用第三方的录制工具(badboy)或者使用jmeter自带的HTTP代理服务器录制脚本功能 jmeter录制原理:通过ht ...
- QBXT模拟赛1
总结 期望得分:\(100 + 80 + 10 = 190\) 实际得分:\(90 + 80 + 10 = 180\) 这是在清北的第一场考试,也是在清北考的最高的一次了吧..本来以为能拿\(190\ ...
- MySQL实战45讲学习笔记:第四十四讲
一.引子 这是我们专栏的最后一篇答疑文章,今天我们来说说一些好问题. 在我看来,能够帮我们扩展一个逻辑的边界的问题,就是好问题.因为通过解决这样的问题,能够加深我们对这个逻辑的理解,或者帮我们关联到另 ...
- 最小费用最大流 学习笔记&&Luogu P3381 【模板】最小费用最大流
题目描述 给出一个网络图,以及其源点和汇点,每条边已知其最大流量和单位流量费用,求出其网络最大流和在最大流情况下的最小费用. 题目链接 思路 最大流是没有问题的,关键是同时保证最小费用,因此,就可以把 ...