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中使用HTMLParser解析HTML的教程
Apr 29 Python
Python中数字以及算数运算符的相关使用
Oct 12 Python
Python实现字符串格式化输出的方法详解
Sep 20 Python
python编程之requests在网络请求中添加cookies参数方法详解
Oct 25 Python
Python利用字典将两个通讯录文本合并为一个文本实例
Jan 16 Python
python3+opencv3识别图片中的物体并截取的方法
Dec 05 Python
11个Python Pandas小技巧让你的工作更高效(附代码实例)
Apr 30 Python
在Python中os.fork()产生子进程的例子
Aug 08 Python
Python通过Manager方式实现多个无关联进程共享数据的实现
Nov 07 Python
Python 实现打印单词的菱形字符图案
Apr 12 Python
浅谈如何使用python抓取网页中的动态数据实现
Aug 17 Python
python开发飞机大战游戏
Jul 15 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
第十节 抽象方法和抽象类 [10]
2006/10/09 PHP
学习php设计模式 php实现享元模式(flyweight)
2015/12/07 PHP
利用php输出不同的心形图案
2016/04/22 PHP
基于php数组中的索引数组和关联数组详解
2018/03/12 PHP
javascript编程起步(第一课)
2007/01/10 Javascript
JavaScript 一行代码,轻松搞定浮动快捷留言-V2升级版
2010/04/02 Javascript
jQuery结合Json提交数据到Webservice,并接收从Webservice返回的Json数据
2011/02/18 Javascript
node.js中的fs.utimesSync方法使用说明
2014/12/15 Javascript
jquery实现可旋转可拖拽的文字效果代码
2016/01/27 Javascript
jQuery实现简单的DIV拖动效果
2016/02/19 Javascript
基于Bootstrap使用jQuery实现输入框组input-group的添加与删除
2016/05/03 Javascript
利用transition实现文字上下抖动的效果
2017/01/21 Javascript
ES6入门教程之let和const命令详解
2017/05/17 Javascript
JavaScript之filter_动力节点Java学院整理
2017/06/28 Javascript
JavaScrip数组删除特定元素的几种方法总结
2017/09/06 Javascript
Bootstrap Table 删除和批量删除
2017/09/22 Javascript
vue 搭建后台系统模块化开发详解
2019/05/01 Javascript
微信小程序实现元素渐入渐出动画效果封装方法
2019/05/18 Javascript
[01:11:21]DOTA2-DPC中国联赛 正赛 Phoenix vs CDEC BO3 第三场 3月7日
2021/03/11 DOTA
将Python代码打包为jar软件的简单方法
2015/08/04 Python
Python闭包的两个注意事项(推荐)
2017/03/20 Python
Python入门_学会创建并调用函数的方法
2017/05/16 Python
Python基础学习之基本数据结构详解【数字、字符串、列表、元组、集合、字典】
2019/06/18 Python
使用python serial 获取所有的串口名称的实例
2019/07/02 Python
DJango的创建和使用详解(默认数据库sqlite3)
2019/11/18 Python
python logging 日志的级别调整方式
2020/02/21 Python
Python使用Selenium实现淘宝抢单的流程分析
2020/06/23 Python
pytorch __init__、forward与__call__的用法小结
2021/02/27 Python
canvas实现俄罗斯方块的方法示例
2018/12/13 HTML / CSS
美国名表在线商城:Ashford(支持中文)
2019/09/24 全球购物
会计专业大学生求职信范文
2014/01/28 职场文书
求职信的七个关键技巧
2014/02/05 职场文书
车辆工程专业求职信
2014/04/28 职场文书
国旗下的演讲稿
2014/05/08 职场文书
2020年元旦晚会策划书模板
2019/12/30 职场文书
vue实现Toast组件轻提示
2022/04/10 Vue.js