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 相关文章推荐
用Python编写一个简单的俄罗斯方块游戏的教程
Apr 03 Python
详解使用Python处理文件目录的相关方法
Oct 16 Python
Python的collections模块中namedtuple结构使用示例
Jul 07 Python
windows上安装Anaconda和python的教程详解
Mar 28 Python
Python PyQt5实现的简易计算器功能示例
Aug 23 Python
一些Centos Python 生产环境的部署命令(推荐)
May 07 Python
PyCharm设置SSH远程调试的方法
Jul 17 Python
python 通过类中一个方法获取另一个方法变量的实例
Jan 22 Python
pytorch中如何使用DataLoader对数据集进行批处理的方法
Aug 06 Python
python 字段拆分详解
Dec 17 Python
Python ArgumentParse的subparser用法说明
Apr 20 Python
Python绘制K线图之可视化神器pyecharts的使用
Mar 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 版本]
2007/03/20 PHP
详解PHP原生DOM对象操作XML的方法
2016/10/17 PHP
JS event使用方法详解
2008/04/28 Javascript
不使用ajax实现无刷新提交表单
2014/12/21 Javascript
javascript中键盘事件用法实例分析
2015/01/30 Javascript
jQuery删除一个元素后淡出效果展示删除过程的方法
2015/03/18 Javascript
JavaScript中的Function函数
2015/08/27 Javascript
详解js图片轮播效果实现原理
2015/12/17 Javascript
轻松搞定jQuery.noConflict()
2016/02/15 Javascript
DOM操作原生js 的bug,使用jQuery 可以消除的解决方法
2016/09/04 Javascript
概述BootStrap中role="form"及role作用角色
2016/12/08 Javascript
使用vue.js2.0 + ElementUI开发后台管理系统详细教程(二)
2017/01/21 Javascript
纯JS实现弹性导航条效果
2017/03/06 Javascript
jquery DataTable实现前后台动态分页
2017/06/17 jQuery
基于js中this和event 的区别(详解)
2017/10/24 Javascript
nodejs结合socket.io实现websocket通信功能的方法
2018/01/12 NodeJs
webpack配置导致字体图标无法显示的解决方法
2018/03/06 Javascript
ES6 迭代器与可迭代对象的实现
2019/02/11 Javascript
详解如何实现Element树形控件Tree在懒加载模式下的动态更新
2019/04/25 Javascript
layui插件表单验证提交触发提交的例子
2019/09/09 Javascript
微信分享invalid signature签名错误踩过的坑
2020/04/11 Javascript
Python新手们容易犯的几个错误总结
2017/04/01 Python
Python人脸识别初探
2017/12/21 Python
Django开发中的日志输出的方法
2018/07/02 Python
利用python在excel里面直接使用sql函数的方法
2019/02/08 Python
python双向链表原理与实现方法详解
2019/12/03 Python
HTML5 3D衣服摇摆动画特效
2016/03/17 HTML / CSS
canvas实现图片镜像翻转的2种方式
2020/07/22 HTML / CSS
BONIA波尼亚新加坡官网:皮革手袋,鞋类和配件
2016/08/25 全球购物
XD健身器材:Kevlar球、Crossfit健身球
2019/03/26 全球购物
JBL加拿大官方商店:扬声器、耳机等
2020/10/23 全球购物
大学生志愿者感言
2014/01/15 职场文书
超市促销活动总结
2014/07/01 职场文书
中华在我心中演讲稿
2014/09/13 职场文书
营业员岗位职责范本
2015/04/14 职场文书
nginx请求限制配置方法
2021/07/09 Servers