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 25 Python
Python实现SMTP发送邮件详细教程
Mar 02 Python
Python数据结构之翻转链表
Feb 25 Python
python实现kMeans算法
Dec 21 Python
基于scrapy的redis安装和配置方法
Jun 13 Python
python中的for循环
Sep 28 Python
Python多进程入门、分布式进程数据共享实例详解
Jun 03 Python
python实现凯撒密码、凯撒加解密算法
Jun 11 Python
Python图像阈值化处理及算法比对实例解析
Jun 19 Python
如何用python开发Zeroc Ice应用
Jan 29 Python
Python调用SMTP服务自动发送Email的实现步骤
Feb 07 Python
python正则表达式re.search()的基本使用教程
May 21 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
在mysql数据库原有字段后增加新内容
2009/11/26 PHP
ini_set的用法介绍
2014/01/07 PHP
PHP命名空间(Namespace)简明教程
2014/06/11 PHP
php浏览历史记录的方法
2015/03/10 PHP
PHP用反撇号执行外部命令
2015/04/14 PHP
php实现的后台表格分页功能示例
2017/10/23 PHP
PHP区块查询实现方法分析
2018/05/12 PHP
让回调函数 showResponse 也带上参数的代码
2007/08/13 Javascript
JavaScript 闭包在封装函数时的简单分析
2009/11/28 Javascript
js 判断checkbox是否选中的实现代码
2010/11/23 Javascript
用原生JavaScript实现jQuery的$.getJSON的解决方法
2013/05/03 Javascript
详解AngularJS中的表达式使用
2015/06/16 Javascript
Node.js与Sails ~项目结构与Mvc实现及日志机制
2015/10/14 Javascript
javascript算法之二叉搜索树的示例代码
2017/09/12 Javascript
vue项目中使用scss的方法步骤
2019/05/16 Javascript
vue使用高德地图根据坐标定位点的实现代码
2019/08/22 Javascript
微信小程序分包加载代码实现方法详解
2019/09/23 Javascript
layer页面跳转,获取html子节点元素的值方法
2019/09/27 Javascript
[00:35]DOTA2上海特级锦标赛 VP战队宣传片
2016/03/04 DOTA
python通过字典dict判断指定键值是否存在的方法
2015/03/21 Python
python下载文件时显示下载进度的方法
2015/04/02 Python
Python实战小程序利用matplotlib模块画图代码分享
2017/12/09 Python
python实现识别手写数字 python图像识别算法
2020/03/23 Python
Python实现的查询mysql数据库并通过邮件发送信息功能
2018/05/17 Python
Python 爬虫之Beautiful Soup模块使用指南
2018/07/05 Python
python通过安装itchat包实现微信自动回复收到的春节祝福
2020/01/19 Python
Python开发之pip安装及使用方法详解
2020/02/21 Python
Python爬虫实现百度翻译功能过程详解
2020/05/29 Python
Clarks鞋美国官网:全球领军鞋履品牌
2017/05/13 全球购物
英国手机壳购买网站:Case Hut
2019/04/11 全球购物
美国眼镜在线零售商:Dualens
2019/12/07 全球购物
会计应届生的自荐信
2013/12/13 职场文书
夏季奶茶店创业计划书
2014/01/16 职场文书
服务承诺书
2015/01/19 职场文书
离婚协议书样本
2015/01/26 职场文书
Nginx解决403 forbidden的完整步骤
2021/04/01 Servers