python的helper_SQLHelper ------ python实现
SQLHelper ------ python实现
1.第一种:
import pymysql
import threading
from DBUtils.PooledDB import PooledDB
class SqlHelper(object):
def __init__(self):
self.pool = PooledDB(
creator=pymysql, # 使用链接数据库的模块
maxconnections=6, # 连接池允许的最大连接数,0和None表示不限制连接数
mincached=2, # 初始化时,链接池中至少创建的链接,0表示不创建
blocking=True, # 连接池中如果没有可用连接后,是否阻塞等待。True,等待;False,不等待然后报错
ping=0,
# ping MySQL服务端,检查是否服务可用。# 如:0 = None = never, 1 = default = whenever it is requested, 2 = when a cursor is created, 4 = when a query is executed, 7 = always
host='127.0.0.1',
port=3306,
user='root',
password='000000',
database='flask_day1',
charset='utf8'
)
# 用来获取local对象
self.local = threading.local()
def open(self):
"""
获取数据库连接,游标对象
"""
conn = self.pool.connection()
cursor = conn.cursor()
return conn,cursor
def close(self,cursor,conn):
"""
关闭游标,数据库连接
"""
cursor.close()
conn.close()
def __enter__(self):
"""
with语句自动触发,执行此方法
"""
conn,cursor = self.open()
rv = getattr(self.local,"stack",None)
if not rv:
self.local.stack = [(conn,cursor)]
else:
rv.append([(conn,cursor)])
self.local.stack = rv
return cursor
def __exit__(self, exc_type, exc_val, exc_tb):
"""
with语句结束时执行此方法
"""
rv = getattr(self.local,"stack",None)
if not rv:
return
conn,cursor = rv[-1]
self.close(cursor,conn)
db = SqlHelper()
# 调用文件
import threading
def task(i):
sql = "select * from book;"
with db as cur:
cur.execute(sql)
data = cur.fetchall()
print(i,data)
for i in range(5):
t = threading.Thread(target=task,args=(i,))
t.start()
说明:
这个是借鉴了多线程中的threading.local()方法,当每个线程都会去获取自己对应的数据,所以在每一个线程开启时就会执行task方法,这个方法中有with这方法,这个方法是去调用上下文管理器,就需要执行这个对象中的__enter__()方法和__exit__()方法;进来时执行__enter__()这个方法,并且需要又返回值,这个返回值就是with db as cur:中的cur的值,在结束的时候需要执行__exit__()方法;在执行__enter__()方法的时候在里边将当前这个线程的数据写成一个字典,字典的键是固定的名字stack,字典的值是一个列表套元组形式,元组中是conn,cursor(数据库连接,游标对象);将这个保存到threading.local()实例化出来的对象中self.local,在对数据库操作完之后,with也要执行__exit__()方法,在这个方法中会使用现在的self.local对象去获取存在这个对象中的那个字典,获取对应的值,然后对对游标进行关闭,数据的连接进行关闭;
2.第二种:
import pymysql
import threading
from DBUtils.PooledDB import PooledDB
import greenlet
POOL = PooledDB(
creator=pymysql, # 使用链接数据库的模块
maxconnections=6, # 连接池允许的最大连接数,0和None表示不限制连接数
mincached=2, # 初始化时,链接池中至少创建的链接,0表示不创建
blocking=True, # 连接池中如果没有可用连接后,是否阻塞等待。True,等待;False,不等待然后报错
ping=0,
# ping MySQL服务端,检查是否服务可用。# 如:0 = None = never, 1 = default = whenever it is requested, 2 = when a cursor is created, 4 = when a query is executed, 7 = always
host='127.0.0.1',
port=3306,
user='root',
password='000000',
database='flask_day1',
charset='utf8'
)
class SqlHelper(object):
def __init__(self):
self.conn = None
self.cursor = None
def open(self):
conn = POOL.connection()
cursor = conn.cursor()
return conn,cursor
def close(self,cursor,conn):
cursor.close()
conn.close()
def __enter__(self):
self.conn,self.cursor = self.open()
return self.cursor
def __exit__(self, exc_type, exc_val, exc_tb):
self.close(self.cursor,self.conn)
调用语句:
import threading
def task(i):
sql = "select * from book;"
with SqlHelper() as cur:
cur.execute(sql)
data = cur.fetchall()
print(i,data)
for i in range(5):
t = threading.Thread(target=task,args=(i,))
t.start()
说明:
此方法比较简单,理解起来也比较容易,首先创建一次数据库连接池,在SqlHelper类中只是调用执行就行,不用在重复实例化对象;每次执行sql语句是实例化SqlHelper方法就行,由于每次实例化的对象不一样所以就不会有数据覆盖了;
python的helper_SQLHelper ------ python实现相关推荐
- Python培训:Python有哪些函数?你了解几种?
本期小编要为大家带来的Python教程就是关于Python函数这方面的,我们都知道Python函数,一般是指组织好的.可重复使用的.用来实现单一或相关联功能的代码段,Python函数包含系统中自带的一 ...
- python新手任务:python循环嵌套
2019独角兽企业重金招聘Python工程师标准>>> Python 循环嵌套 Python 语言允许在一个循环体里面嵌入另一个循环. Python for 循环嵌套语法: Pyth ...
- Python入门 Python自学路线 Python如何学习
本文介绍Python入门 Python自学路线 Python如何学习.先说点题外话吧:首先呢,我刚开始接触编程的时候,学的是C,那时候Python还没有这么火,后来学了C++,PHP,Java,前端. ...
- 黑客都用Python?学习Python的4个理由!
2019独角兽企业重金招聘Python工程师标准>>> Python 是一个高层次的结合了解释性.编译性.互动性和面向对象的脚本语言. 重点是,Python 是一种对初学者非常友好的 ...
- python 3 最佳python中文书籍下载
筛选了2年内优秀的python书籍,个别经典的书籍扩展到5年内. 尽量只收集通用的书籍,专用的书籍只收集特别优秀者. python专业书籍汇总 Python基础教程(第3版) - 2017.pdf 图 ...
- 【循序渐进学Python】1. Python基础知识
1. Python安装和配置 首先需要到Python的官方网站(http://www.python.org/getit/) 下载安装包,现在Python的发行版分为兼容之前Python程序的Pytho ...
- python接口测试声音,python接口测试-登录
终于调同登录接口了 import requests import json import unittest import HTMLTestRunner ur1='http://118.178.247. ...
- 二十一. Python基础(21)--Python基础(21)
二十一. Python基础(21)--Python基础(21) 1 ● 类的命名空间 #对于类的静态属性: #类.属性: 调用的就是类中的属性 #对象.属性: 先从自己的内存空间里找名 ...
- Anaconda安装Python,提示Python不是内部或外部命令解决方法
Anaconda安装Python,提示Python不是内部或外部命令解决方法 参考文章: (1)Anaconda安装Python,提示Python不是内部或外部命令解决方法 (2)https://ww ...
最新文章
- 自己架设windows升级服务器
- jquery selector 使用方法
- 【Android 应用开发】Paint 渲染 之 BitmapShader 位图渲染 ( 渲染流程 | CLAMP 拉伸最后像素 | REPEAT 重复绘制图片 | MIRROR 绘制反向图片 )
- nginx(一)安装与命令总结
- Java IO: FileInputStream
- 破解key file时经常用到的几个API函数及其用法
- 【qt】QT 的信号与槽机制
- 内容可寻址存储器CAM简介
- 64位centos下QQ无法输入中文只能输入英文
- MyEclipse8.5中的可视化界面JTable和JComboBox应用,及常用方法
- fastboot 常用命令
- C 语言绝对值函数abs实现技巧
- 程序员新电脑常用软件安装
- 二值图像连通区域标记matlab,二值图像快速连通区域计算方法与流程
- 七大江河水系--黄河(一)
- 什么是jsp,什么是Servlet?jsp和Servlet有什么区别?
- 淘晶驰串口屏_ 串口屏卡顿的原因
- 面试常问的16个C语言问题,你能答上来几个?
- swiper的使用教程
- 集值映射(set -valued mapping)
热门文章
- python分数运算使用Fraction模块
- DeepWide推荐系统
- 计算机领域收费sci期刊,计算机领域收费sci期刊 - 百度学术
- php tp 查数据库数据一条_php读取数据库乱码
- tensorflow教程 一元线性回归
- 一致性直线提取--Coherent Line Drawing
- LeetCode 215. Kth Largest Element in an Array--数字第K大的元素--最大堆或优先队列--C++,Python解法
- Linux下 curl 代理设置注意事项--curl proxy
- Linux下tar解压到当前目录,zip压缩,tar压缩,tar解压
- Linux命令查看服务器信息