Flask框架使用DBUtils模块连接数据库操作示例


Posted in Python onJuly 20, 2018

本文实例讲述了Flask框架使用DBUtils模块连接数据库的操作方法。分享给大家供大家参考,具体如下:

Flask连接数据库

数据库连接池:

Django使用:django ORM(pymysql/MySqldb)

Flask/其他使用:

    -原生SQL
        -pymysql(支持python2/3)
        -MySqldb(支持python2)
    -SQLAchemy(ORM)

原生SQL

需要解决的问题:

        -不能为每个用户创建一个连接
        -创建一定数量的连接池,如果有人来

使用DBUtils模块

两种使用模式:

    1 为每个线程创建一个连接,连接不可控,需要控制线程数
    2 创建指定数量的连接在连接池,当线程访问的时候去取,如果不够了线程排队,直到有人释放。平时建议使用这种!!!

模式一:

import pymysql
from DBUtils.PersistentDB import PersistentDB
POOL = PersistentDB(
  creator=pymysql, # 使用链接数据库的模块
  maxusage=None, # 一个链接最多被重复使用的次数,None表示无限制
  setsession=[], # 开始会话前执行的命令列表。如:["set datestyle to ...", "set time zone ..."]
  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
  closeable=False,
  # 建议为False,如果为False时, conn.close() 实际上被忽略,供下次使用,再线程关闭时,才会自动关闭链接。如果为True时, conn.close()则关闭链接,那么再次调用pool.connection时就会报错,因为已经真的关闭了连接(pool.steady_connection()可以获取一个新的链接)
  threadlocal=None, # 本线程独享值得对象,用于保存链接对象,如果链接对象被重置
  host='127.0.0.1',
  port=3306,
  user='root',
  password='123',
  database='pooldb',
  charset='utf8'
)
def func():
  conn = POOL.connection(shareable=False)
  cursor = conn.cursor()
  cursor.execute('select * from tb1')
  result = cursor.fetchall()
  cursor.close()
  conn.close()
func()

模式二(推荐):

import time
import pymysql
import threading
from DBUtils.PooledDB import PooledDB, SharedDBConnection
POOL = PooledDB(
  creator=pymysql, # 使用链接数据库的模块
  maxconnections=6, # 连接池允许的最大连接数,0和None表示不限制连接数
  mincached=2, # 初始化时,链接池中至少创建的空闲的链接,0表示不创建
  maxcached=5, # 链接池中最多闲置的链接,0和None不限制
  maxshared=3, # 链接池中最多共享的链接数量,0和None表示全部共享。PS: 无用,因为pymysql和MySQLdb等模块的 threadsafety都为1,所有值无论设置为多少,_maxcached永远为0,所以永远是所有链接都共享。
  blocking=True, # 连接池中如果没有可用连接后,是否阻塞等待。True,等待;False,不等待然后报错
  maxusage=None, # 一个链接最多被重复使用的次数,None表示无限制
  setsession=[], # 开始会话前执行的命令列表。如:["set datestyle to ...", "set time zone ..."]
  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='123',
  database='pooldb',
  charset='utf8'
)
def func():
  # 检测当前正在运行连接数的是否小于最大链接数,如果不小于则:等待或报raise TooManyConnections异常
  # 否则
  # 则优先去初始化时创建的链接中获取链接 SteadyDBConnection。
  # 然后将SteadyDBConnection对象封装到PooledDedicatedDBConnection中并返回。
  # 如果最开始创建的链接没有链接,则去创建一个SteadyDBConnection对象,再封装到PooledDedicatedDBConnection中并返回。
  # 一旦关闭链接后,连接就返回到连接池让后续线程继续使用。
  conn = POOL.connection()
  # print(th, '链接被拿走了', conn1._con)
  # print(th, '池子里目前有', pool._idle_cache, '\r\n')
  cursor = conn.cursor()
  cursor.execute('select * from tb1')
  result = cursor.fetchall()
  conn.close()
func()

具体写法:

通过导入的方式

app.py

from flask import Flask
from db_helper import SQLHelper
app = Flask(__name__)
@app.route("/")
def hello():
  result = SQLHelper.fetch_one('select * from xxx',[])
  print(result)
  return "Hello World"
if __name__ == '__main__':
  app.run()

DBUTILs

以下为两种写法:

第一种是用静态方法装饰器,通过直接执行类的方法来连接使用数据库

第二种是通过实例化对象,通过对象来调用方法执行语句

建议使用第一种,更方便,第一种还可以在修改优化为,将一些公共语句在摘出来使用。

import time
import pymysql
from DBUtils.PooledDB import PooledDB
POOL = PooledDB(
  creator=pymysql, # 使用链接数据库的模块
  maxconnections=6, # 连接池允许的最大连接数,0和None表示不限制连接数
  mincached=2, # 初始化时,链接池中至少创建的空闲的链接,0表示不创建
  maxcached=5, # 链接池中最多闲置的链接,0和None不限制
  maxshared=3, # 链接池中最多共享的链接数量,0和None表示全部共享。PS: 无用,因为pymysql和MySQLdb等模块的 threadsafety都为1,所有值无论设置为多少,_maxcached永远为0,所以永远是所有链接都共享。
  blocking=True, # 连接池中如果没有可用连接后,是否阻塞等待。True,等待;False,不等待然后报错
  maxusage=None, # 一个链接最多被重复使用的次数,None表示无限制
  setsession=[], # 开始会话前执行的命令列表。如:["set datestyle to ...", "set time zone ..."]
  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='123',
  database='pooldb',
  charset='utf8'
)
"""
class SQLHelper(object):
  @staticmethod
  def fetch_one(sql,args):
    conn = POOL.connection()
    cursor = conn.cursor()
    cursor.execute(sql, args)
    result = cursor.fetchone()
    conn.close()
    return result
  @staticmethod
  def fetch_all(self,sql,args):
    conn = POOL.connection()
    cursor = conn.cursor()
    cursor.execute(sql, args)
    result = cursor.fetchone()
    conn.close()
    return result
# 调用方式:
result = SQLHelper.fetch_one('select * from xxx',[])
print(result)
"""
"""
#第二种:
class SQLHelper(object):
  def __init__(self):
    self.conn = POOL.connection()
    self.cursor = self.conn.cursor()
  def close(self):
    self.cursor.close()
    self.conn.close()
  def fetch_one(self,sql, args):
    self.cursor.execute(sql, args)
    result = self.cursor.fetchone()
    self.close()
    return result
  def fetch_all(self, sql, args):
    self.cursor.execute(sql, args)
    result = self.cursor.fetchall()
    self.close()
    return result
obj = SQLHelper()
obj.fetch_one()
"""

希望本文所述对大家基于Flask框架的Python程序设计有所帮助。

Python 相关文章推荐
windows系统中python使用rar命令压缩多个文件夹示例
May 06 Python
详解Python的Django框架中的Cookie相关处理
Jul 22 Python
Python实现输出程序执行进度百分比的方法
Sep 16 Python
Python之pandas读写文件乱码的解决方法
Apr 20 Python
python sys,os,time模块的使用(包括时间格式的各种转换)
Apr 27 Python
python监控文件并且发送告警邮件
Jun 21 Python
python将类似json的数据存储到MySQL中的实例
Jul 12 Python
如何使用python进行pdf文件分割
Nov 11 Python
TensorFlow命名空间和TensorBoard图节点实例
Jan 23 Python
tensorflow 保存模型和取出中间权重例子
Jan 24 Python
Win10下安装并使用tensorflow-gpu1.8.0+python3.6全过程分析(显卡MX250+CUDA9.0+cudnn)
Feb 17 Python
浅谈Python中threading join和setDaemon用法及区别说明
May 02 Python
Flask框架WTForm表单用法示例
Jul 20 #Python
Python使用pymongo模块操作MongoDB的方法示例
Jul 20 #Python
Python闭包函数定义与用法分析
Jul 20 #Python
Django rest framework工具包简单用法示例
Jul 20 #Python
Django 中使用流响应处理视频的方法
Jul 20 #Python
Python实现手写一个类似django的web框架示例
Jul 20 #Python
python 实现求解字符串集的最长公共前缀方法
Jul 20 #Python
You might like
php在程序中将网页生成word文档并提供下载的代码
2012/10/09 PHP
PHP实现多图片上传类实例
2014/07/26 PHP
jQuery ui1.7 dialog只能弹出一次问题
2009/08/27 Javascript
IE 当eval遇上function的处理
2011/08/09 Javascript
解决用jquery load加载页面到div时,不执行页面js的问题
2014/02/22 Javascript
JS封装的选项卡TAB切换效果示例
2016/09/20 Javascript
Javascript 创建类并动态添加属性及方法的简单实现
2016/10/20 Javascript
详解Vue webapp项目通过HBulider打包原生APP
2018/06/29 Javascript
vue中使用axios post上传头像/图片并实时显示到页面的方法
2018/09/27 Javascript
vue 父组件给子组件传值子组件给父组件传值的实例代码
2019/04/15 Javascript
简单了解JavaScript异步
2019/05/23 Javascript
ionic2.0双击返回键退出应用
2019/09/17 Javascript
vue下的@change事件的实现
2019/10/25 Javascript
Vue.js 中制作自定义选择组件的代码附演示demo
2020/02/28 Javascript
JS Generator 函数的含义与用法实例总结
2020/04/08 Javascript
JavaScript禁止右击保存图片,禁止拖拽图片的实现代码
2020/04/28 Javascript
在Docker上部署Python的Flask框架的教程
2015/04/08 Python
python自动化脚本安装指定版本python环境详解
2017/09/14 Python
Python发送邮件功能示例【使用QQ邮箱】
2018/12/04 Python
python基于三阶贝塞尔曲线的数据平滑算法
2019/12/27 Python
HTML5 画布canvas使用方法
2016/03/18 HTML / CSS
欧洲最大的化妆品连锁公司:Douglas道格拉斯
2017/05/06 全球购物
大学生简单自荐信
2013/11/10 职场文书
监理员的岗位职责
2013/11/13 职场文书
管理站站长岗位职责
2013/11/27 职场文书
我的求职计划书
2014/01/10 职场文书
夏季奶茶店创业计划书
2014/01/16 职场文书
入学生会自荐书范文
2014/02/05 职场文书
预备党员表决心书
2014/03/11 职场文书
2014年安全生产目标责任书
2014/07/23 职场文书
三八妇女节趣味活动方案
2014/08/23 职场文书
医院党员公开承诺书
2014/08/30 职场文书
国博复兴之路观后感
2015/06/02 职场文书
执行力心得体会范文
2016/01/11 职场文书
2016年法制宣传月活动总结
2016/04/01 职场文书
python实现双向链表原理
2022/05/25 Python