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

yipeiwu_com6年前Python基础

本文实例讲述了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程序设计有所帮助。

相关文章

django rest framework vue 实现用户登录详解

django rest framework vue 实现用户登录详解

后端代码就不介绍了,可以参考 django rest framework 实现用户登录认证 这里介绍一下前端代码,和前后端的联调过程 在components下新建login.vue 文件...

python实现图书馆研习室自动预约功能

python实现图书馆研习室自动预约功能

本文为大家分享了python实现图书馆研习室自动预约的具体代码,供大家参考,具体内容如下 简介 现在好多学校为学生提供了非常良好的学习环境,通常体现在自习教室的设施设备上。对此不得不提一...

讲解Python中if语句的嵌套用法

 可能有这样一种情况,当你想检查其他条件后一个条件解析为真。在这种情况下,可以使用嵌套的if结构。 在嵌套的 if 语句结构,可以在一个 if... elif... else...

tensorflow 变长序列存储实例

问题 问题是这样的,要把一个数组存到tfrecord中,然后读取 a = np.array([[0, 54, 91, 153, 177,1], [0, 50, 89, 147,...

django模型中的字段和model名显示为中文小技巧分享

简单方法: models.py 复制代码 代码如下: class IceCreamBar(models.Model):     title =  ...