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实现相关推荐

  1. Python培训:Python有哪些函数?你了解几种?

    本期小编要为大家带来的Python教程就是关于Python函数这方面的,我们都知道Python函数,一般是指组织好的.可重复使用的.用来实现单一或相关联功能的代码段,Python函数包含系统中自带的一 ...

  2. python新手任务:python循环嵌套

    2019独角兽企业重金招聘Python工程师标准>>> Python 循环嵌套 Python 语言允许在一个循环体里面嵌入另一个循环. Python for 循环嵌套语法: Pyth ...

  3. Python入门 Python自学路线 Python如何学习

    本文介绍Python入门 Python自学路线 Python如何学习.先说点题外话吧:首先呢,我刚开始接触编程的时候,学的是C,那时候Python还没有这么火,后来学了C++,PHP,Java,前端. ...

  4. 黑客都用Python?学习Python的4个理由!

    2019独角兽企业重金招聘Python工程师标准>>> Python 是一个高层次的结合了解释性.编译性.互动性和面向对象的脚本语言. 重点是,Python 是一种对初学者非常友好的 ...

  5. python 3 最佳python中文书籍下载

    筛选了2年内优秀的python书籍,个别经典的书籍扩展到5年内. 尽量只收集通用的书籍,专用的书籍只收集特别优秀者. python专业书籍汇总 Python基础教程(第3版) - 2017.pdf 图 ...

  6. 【循序渐进学Python】1. Python基础知识

    1. Python安装和配置 首先需要到Python的官方网站(http://www.python.org/getit/) 下载安装包,现在Python的发行版分为兼容之前Python程序的Pytho ...

  7. python接口测试声音,python接口测试-登录

    终于调同登录接口了 import requests import json import unittest import HTMLTestRunner ur1='http://118.178.247. ...

  8. 二十一. Python基础(21)--Python基础(21)

    二十一. Python基础(21)--Python基础(21) 1 ● 类的命名空间 #对于类的静态属性:     #类.属性: 调用的就是类中的属性     #对象.属性: 先从自己的内存空间里找名 ...

  9. Anaconda安装Python,提示Python不是内部或外部命令解决方法

    Anaconda安装Python,提示Python不是内部或外部命令解决方法 参考文章: (1)Anaconda安装Python,提示Python不是内部或外部命令解决方法 (2)https://ww ...

最新文章

  1. 自己架设windows升级服务器
  2. jquery selector 使用方法
  3. 【Android 应用开发】Paint 渲染 之 BitmapShader 位图渲染 ( 渲染流程 | CLAMP 拉伸最后像素 | REPEAT 重复绘制图片 | MIRROR 绘制反向图片 )
  4. nginx(一)安装与命令总结
  5. Java IO: FileInputStream
  6. 破解key file时经常用到的几个API函数及其用法
  7. 【qt】QT 的信号与槽机制
  8. 内容可寻址存储器CAM简介
  9. 64位centos下QQ无法输入中文只能输入英文
  10. MyEclipse8.5中的可视化界面JTable和JComboBox应用,及常用方法
  11. fastboot 常用命令
  12. C 语言绝对值函数abs实现技巧
  13. 程序员新电脑常用软件安装
  14. 二值图像连通区域标记matlab,二值图像快速连通区域计算方法与流程
  15. 七大江河水系--黄河(一)
  16. 什么是jsp,什么是Servlet?jsp和Servlet有什么区别?
  17. 淘晶驰串口屏_ 串口屏卡顿的原因
  18. 面试常问的16个C语言问题,你能答上来几个?
  19. swiper的使用教程
  20. 集值映射(set -valued mapping)

热门文章

  1. python分数运算使用Fraction模块
  2. DeepWide推荐系统
  3. 计算机领域收费sci期刊,计算机领域收费sci期刊 - 百度学术
  4. php tp 查数据库数据一条_php读取数据库乱码
  5. tensorflow教程 一元线性回归
  6. 一致性直线提取--Coherent Line Drawing
  7. LeetCode 215. Kth Largest Element in an Array--数字第K大的元素--最大堆或优先队列--C++,Python解法
  8. Linux下 curl 代理设置注意事项--curl proxy
  9. Linux下tar解压到当前目录,zip压缩,tar压缩,tar解压
  10. Linux命令查看服务器信息