Flask数据库连接池 DBUtils 模块

目录

一、原理:

二、安装

三、封装


一、原理:

flask中是没有ORM的,如果在flask里面连接数据库有两种方式

1:pymysql
2:SQLAlchemy:是python 操作数据库的一个库。能够进行 orm 映射官方文档 sqlchemy


SQLAlchemy“采用简单的Python语言,为高效和高性能的数据库访问设计,实现了完整的企业级持久模型”。SQLAlchemy的理念是,SQL数据库的量级和性能重要于对象集合;而对象集合的抽象又重要于表和行。

这里我们重点节点介绍【BDUtils数据库链接池】
 链接池原理:
- 模式一:基于threaing.local实现为每一个线程创建一个连接,关闭是伪关闭,当前线程可以重复。
- 模式二:连接池原理
- 可以设置连接池中最大连接数 9
- 默认启动时,连接池中创建连接 5
- 如果有三个线程来数据库中获取连接:
  - a 如果三个同时来的,一人给一个链接
  - b 如果一个一个来,有时间间隔,用一个链接就可以为三个线程提供服务
  - c 说不准
    有可能:1个链接就可以为三个线程提供服务
    有可能:2个链接就可以为三个线程提供服务
    有可能:3个链接就可以为三个线程提供服务
PS、:maxshared在使用pymysql中均无用。链接数据库的模块:只有threadsafety>1的时候才有用。

 

那么我们用pymysql来做。为什么要使用数据库连接池呢?不用连接池有什么不好的地方呢?

那是因为使用pymysql,每次操作都要链接数据库,链接次数过多。

二、安装

pip install DBUtils

三、封装

# 新建一个db的py文件
import pymysql
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='mima',      #密码
    database='db',   #库名
    charset='utf8',
    # cursorclass = pymysql.cursors.DictCursor # 配置数据已字典的类型返回,不配置返回元组
    # 在默认情况下cursor方法返回的是BaseCursor类型对象,BaseCursor类型对象在执行查询后每条记录的结果以列表(list)表示。
    # 如果要返回字典(dict)表示的记录,就要设置cursorclass参数为pymysql.cursors.DictCursor类。
   )


class ConnectDB(object):
    def __init__(self):
        self.conn = POOL.connection()
        try:
            # self.cursor = self.conn.cursor(cursor=pymysql.cursors.DictCursor)
            self.cursor = self.conn.cursor()
            print("连接数据库成功!")

        except Exception as e:
            print("连接数据库失败:%s " % e)

    def get_one(self, sql_script):

        try:
            cursor = self.cursor  # 获取游标
            cursor.execute(sql_script)
            data = cursor.fetchone()
            print("sql执行成功!信息:%s" % sql_script)
            print("获取查询结果!信息:%s" % str(data[0]))
            return data[0]
        except Exception as e:
            print("执行sql出现错误,信息: %s " % e)
        finally:
            self.cursor.close()
            self.conn.close()

    # 获取多条查询结果
    def get_all(self, sql_script):
        try:
            cursor = self.cursor  # 获取游标
            cursor.execute(sql_script)
            data = cursor.fetchall()
            print("sql执行成功!信息:%s" % sql_script)
            print("获取查询结果!信息:%s" % str(data))
            return data
        except Exception as e:
            print("执行sql出现错误,信息: %s " % e)
        finally:
            self.cursor.close()
            self.conn.close()


if __name__ == '__main__':
    sql = 'SELECT * FROM tb1 WHERE id=%s'
    sql1 = (1,)
    result = ConnectDB().get_all(sql, sql1)
    print(result)

 

你可能感兴趣的:(python)