数据库连接池

为啥要使用数据库连接池

  • 频繁的连接和断开数据库,消耗大,效率低
  • DBUtils可以创建多个线程连接数据库,且一直保持连接,不会断开
  • 执行数据库操作时,由数据池分配线程,当数据池空时,可选择等待或者抛错

安装

pip3 install DBUtils

基础用法

  • 创建数据池
    import time
    import threading import pymysql
    from DBUtils.PooledDB import PooledDB # 创建数据库连接池
    POOL = PooledDB(
    creator=pymysql,
    maxconnections=20, # 定义最大连接数
    mincached=2, # 定义起始连接数
    host='127.0.0.1',
    blocking=True, # 连接池用完时,True是等待,False时抛错
    port=3306,
    user='root',
    password='123',
    database='pooldb',
    charset='utf8'
    ) # 去数据库连接池获取一个连接
    conn = POOL.connection() cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
    cursor.execute('select * from tb1')
    result = cursor.fetchall() # 将此连接放还给连接池
    conn.close()

在flask中应用

  • 定义

    import pymysql
    
    from DBUtils.PooledDB import PooledDB
    
    class SQLHelper(object):
    def __init__(self):
    # 创建数据库连接池
    self.pool = PooledDB(
    creator=pymysql,
    maxconnections=5,
    mincached=2,
    blocking=True,
    host='127.0.0.1',
    port=3306,
    user='root',
    password='123',
    database='s23day02',
    charset='utf8'
    ) def connect(self):
    conn = self.pool.connection()
    cursor = conn.cursor()
    return conn,cursor def disconnect(self,conn,cursor):
    cursor.close()
    conn.close() def fetchone(self,sql,params=None):
    """
    获取单条
    :param sql:
    :param params:
    :return:
    """
    if not params:
    params = []
    conn,cursor = self.connect()
    cursor.execute(sql, params)
    result = cursor.fetchone()
    self.disconnect(conn,cursor)
    return result def fetchall(self,sql,params=None):
    """
    获取所有
    :param sql:
    :param params:
    :return:
    """
    import pymysql
    if not params:
    params = []
    conn, cursor = self.connect()
    cursor.execute(sql,params)
    result = cursor.fetchall()
    self.disconnect(conn, cursor)
    return result def commit(self,sql,params):
    """
    增删改
    :param sql:
    :param params:
    :return:
    """
    import pymysql
    if not params:
    params = [] conn, cursor = self.connect()
    cursor.execute(sql, params)
    conn.commit()
    self.disconnect(conn, cursor) db = SQLHelper()
  • 使用单例模式进行

    from flask import Blueprint,url_for,request,render_template,session,redirect
    from ..utils.sqlhelper import db # 创建了一个蓝图对象
    account = Blueprint('account',__name__) @account.route('/login',methods=['GET','POST'])
    def login(): if request.method == 'GET':
    return render_template('login.html')
    user = request.form.get('user')
    pwd = request.form.get('pwd') # 根据用户名和密码去数据库进行校验
    # 连接/SQL语句/关闭
    result = db.fetchone('select * from user where username=%s and password=%s',[user,pwd])
    if result:
    # 在session中存储一个值
    session['user_info'] = user
    return redirect(url_for('user.user_list'))
    return render_template('login.html',error="用户名或密码错误")

【说明】SQLhelper类

  • 封装了数据库操作的相关方法,以便之后业务功能调取,在一定程度上时减少了代码的重复
  • 配合DBUtils,大大提高数据库的操作效率

flask数据库连接池DBUtils的更多相关文章

  1. Python数据库连接池---DBUtils

    Python数据库连接池DBUtils   DBUtils是Python的一个用于实现数据库连接池的模块. 此连接池有两种连接模式: 模式一:为每个线程创建一个连接,线程即使调用了close方法,也不 ...

  2. Python数据库连接池DBUtils

    Python数据库连接池DBUtils   DBUtils是Python的一个用于实现数据库连接池的模块. 此连接池有两种连接模式: 模式一:为每个线程创建一个连接,线程即使调用了close方法,也不 ...

  3. Flask中使用数据库连接池 DBUtils ——(4)

    DBUtils是Python的一个用于实现数据库连接池的模块. 此连接池有两种连接模式: 模式一:为每个线程创建一个连接,线程即使调用了close方法,也不会关闭,只是把连接重新放到连接池,供自己线程 ...

  4. Flask的数据库连接池 DBUtils

    Flask是没有ORM的操作的,如果在flask中连接数据库有两种方式 一.pymysql 二.SQLAlchemy 是python操作数据库的以一个库,能够进行orm映射官网文档 sqlchemy ...

  5. Flask(4):wtforms组件 & 数据库连接池 DBUtils

    wtforms 组件的作用: --- 生成 HTML 标签 --- form 表单验证 示例代码: app.py from flask import Flask, render_template, r ...

  6. Python-flask中数据库连接池DBUtils

    一.DBUtils DBUtils是Python的一个用于实现数据库连接池的模块. 连接池的三种模式: 第一种模式:             它的缺点:每一次请求反复创建数据库的链接,链接的次数太多 ...

  7. Python数据库连接池DBUtils.PooledDB

    DBUtils 是一套用于管理数据库连接池的包,为高频度高并发的数据库访问提供更好的性能,可以自动管理连接对象的创建和释放.最常用的两个外部接口是 PersistentDB 和 PooledDB,前者 ...

  8. python之数据库连接池DBUtils

    DBUtils 是Python 的一个用于实现数据库连接池的模块. 此连接池有两种连接模式: DBUtils :提供两种外部接口: PersistentDB :提供线程专用的数据库连接,并自动管理连接 ...

  9. Python的数据库连接池DBUtils

    DBUtils是Python的一个用于实现数据库连接池的模块. 此连接池有两种连接模式: 模式一:为每个线程创建一个连接,线程即使调用了close方法,也不会关闭,只是把连接重新放到连接池,供自己线程 ...

随机推荐

  1. 现代浏览器性能优化-CSS篇

    我来填坑了,CSS篇终于写出来了,如果你没看过前面的JS篇,可以在这里观看. 众所周知,CSS的加载会阻塞浏览器渲染或是引起浏览器重绘,目前业界普遍推荐把CSS放到<head>中,防止在C ...

  2. swoole组件----mysql查询,插入数据

    注意!任何swoole函数都应该包含在go(function(){}) 经典查询方法query() go(function (){ $swoole_mysql = new Swoole\Corouti ...

  3. C# 重写IComparer 接口

    首先定义比较类 继承自IComparer<Racer> public class RacerComparer : IComparer<Racer> { public enum ...

  4. 1、课程简介-Spring 注解驱动开发

    1.课程简介-Spring 注解驱动开发

  5. Chrome浏览器设置自动启用Flash插件

    Chrome浏览器设置自动启用Flash插件   1.打开Chrome浏览器,输入chrome://flags/#run-all-flash-in-allow-mode,打开,找到Enable Eph ...

  6. v-for为什么要加key,能用index作为key么

    前言 在vue中使用v-for时,一直有几个疑问: v-for为什么要加key 为什么有时候用index作为key会出错 带着这个疑问,结合各种博客和源码,终于有了点眉目. virtual dom 要 ...

  7. [Luogu] 消息扩散

    https://www.luogu.org/problemnew/show/2002 Tarjan 缩点 + 入度判断 #include <iostream> #include <c ...

  8. [BJOI2019]排兵布阵 DP

    [BJOI2019]排兵布阵 DP 比较好想的DP,设\(dp[i][j]\)表示第\(i\)个城堡时,已派出\(j\)个士兵.决策时,贪心派出恰好严格大于某一玩家派出的数量的两倍(不然浪费).我们发 ...

  9. xgzc— math 专题训练(二)

    费马小定理&欧拉定理 费马小定理: 如果\(p\)是一个质数,而整数\(a\)不是\(p\)的倍数,\(a^{p-1}\equiv1\pmod p\) 欧拉定理: 当\(a\)与\(n\)互质 ...

  10. codeforces 1249 D2 Too Many Segments (hard version) 贪心+树状数组

    题意 给定n个线段,线段可以相交,第\(i\)个线段覆盖的区间为\([l_i,r_i]\),问最少删除多少个线段让覆盖每个点的线段数量小于等于k. 分析 从左往右扫每个点\(x\),若覆盖点\(x\) ...