当前位置: 首页 > news >正文

flask用DBUtils实现数据库连接池

在这里插入图片描述

flask用DBUtils实现数据库连接池

在 Flask 中,DBUtils 是一种实现数据库连接池的方案。DBUtils 提供了持久性(persistent)和透明的(transient)两种连接池类型。

首先你需要安装 DBUtils 和你需要的数据库驱动。例如,如果你的数据库是 MySQL,你需要安装 mysql-connector-python(也可以用pymysql):

pip install DBUtils mysql-connector-python

然后你可以使用 Flask 的应用工厂模式来创建一个数据库连接池。下面是一个例子:

from flask import Flask, g
from DBUtils.PooledDB import PooledDB
import mysql.connectordef create_app():app = Flask(__name__)# 这些配置项应该放在你的配置文件中app.config.update(DB_HOST='127.0.0.1',DB_DATABASE='test',DB_USER='root',DB_PASSWORD='password',DB_PORT=3306)pool = PooledDB(mysql.connector,maxconnections=10,host=app.config['DB_HOST'],database=app.config['DB_DATABASE'],user=app.config['DB_USER'],password=app.config['DB_PASSWORD'],port=app.config['DB_PORT'])@app.before_requestdef before_request():g.conn = pool.connection()@app.teardown_requestdef teardown_request(exception):g.conn.close()return app

在这个例子中,我们在每个请求开始前从连接池中获取一个连接,并在请求结束后关闭连接。g 是 Flask 提供的一个全局对象,我们可以用它来存储请求级别的数据,比如数据库连接。

使用连接的时候,可以使用 g.conn.cursor() 来创建一个新的游标。

这只是一个基本的例子,实际使用中你可能需要处理更多的情况,比如连接超时、重试、错误处理等。

当然也可以使用 PyMySQL 连接 MySQL 数据库,这取决于你的特定需求和环境。

PyMySQL 是一个纯 Python 实现的 MySQL 客户端,它没有依赖 C 扩展或者 MySQL 的原生客户端库,所以它更容易安装,尤其在像 Windows 这样的环境中。而且 PyMySQL 也提供了完整的 Pythonic 的接口,包括异常处理、上下文管理器等特性。

另一方面,像 mysql-connector-python 这样的包通常会使用 C 扩展或者原生的客户端库,所以它们的性能可能会比 PyMySQL 更好。同时,由于它们使用了原生的客户端库,所以它们也可能支持更多的 MySQL 特性。

所以,你是否应该使用 PyMySQL 还是 mysql-connector-python,取决于你的特定需求。如果你需要更好的性能,或者需要使用一些 PyMySQL 不支持的 MySQL 特性,那么 mysql-connector-python 可能是更好。如果你只需要更简单的安装过程,或者更 Pythonic 的接口,那么 PyMySQL 就行。

如果你想在 Flask 应用中使用 PyMySQL 和 DBUtils 实现连接池,你只需要将上面例子中的 mysql.connector 替换为 pymysql,然后将相应的配置参数修改为 PyMySQL 支持的参数即可。

Flask 的 g 对象

Flask 的 g 是一个特殊的对象,它为每一个请求提供了一个全局的存储空间。g 对象的生命周期只在一个请求周期内,这意味着它在每个请求开始时被创建,然后在请求结束时销毁。每个请求都会有自己的 g 对象。

在单次请求中,g 对象常常被用来存储像数据库连接或者认证信息这样的数据。例如,在请求处理开始时,你可能会打开一个数据库连接并将其存储在 g 对象中,然后在请求的后续处理中,你可以从 g 对象中获取并使用这个数据库连接。

在前面的例子中,我们使用 g.conn = pool.connection() 在请求开始时创建一个数据库连接,并将其存储在 g 对象中。然后,在请求结束时,我们使用 g.conn.close() 关闭这个数据库连接。这样,我们可以确保每个请求都有自己的数据库连接,而且这个连接会在请求结束时被正确地关闭。

需要注意的是,g 对象只在单次请求中是全局的,不同的请求中的 g 对象是隔离的。你不能在一个请求中设置 g 对象的某个属性,然后在另一个请求中读取它。这是因为 Flask 为每个请求创建了一个新的 g 对象。在多线程环境下,Flask 使用线程局部存储来确保每个请求都有自己的 g 对象,这样就避免了请求之间的数据冲突。

补充

PooledDB 是 DBUtils 包中用于创建数据库连接池的类。它的构造函数接受以下参数:

creator:必需参数。这应该是一个数据库模块,它应该包含一个 connect 方法用于建立数据库连接。

mincached:可选参数,缺省值为 0。这是启动时会创建的空闲连接的数量。

maxcached:可选参数,缺省值为 0。这是连接池中空闲连接的最大数量。如果设置为 0,连接池的大小没有上限。

maxconnections:可选参数,缺省值为 0。这是连接池中活动连接的最大数量。如果设置为 0,连接池的大小没有上限。

blocking:可选参数,缺省值为 True。如果设置为 True,当请求的连接数量超过 maxconnections 时,请求会被阻塞直到有连接可用。如果设置为 False,当请求的连接数量超过 maxconnections 时,会抛出一个 TooManyConnections 异常。

maxshared:可选参数,缺省值为 0。当连接的请求数量超过这个数值时,连接会被共享。

maxusage:可选参数,缺省值为 0。一个连接最多被重复使用的次数。如果设置为 0,连接的使用次数没有上限。

setsession:可选参数,缺省值为 None。这应该是一个字符串列表,每个字符串是在连接创建后要执行的 SQL 语句。这可以用于设置 session 级别的变量。

setsession 参数允许你在数据库连接创建后,但在返回给客户端使用之前,执行一些 SQL 语句。这对于设置会话级别(session-level)的数据库参数特别有用。

例如,你可以在每个连接创建后设置事务的隔离级别,或者设置时区等参数。这些设置在数据库的这个会话期间都会一直有效。

这里有一个简单的例子:

from DBUtils.PooledDB import PooledDB
import pymysqlpool = PooledDB(creator=pymysql,host='127.0.0.1',user='root',password='password',database='test',setsession=['SET AUTOCOMMIT = 0',  # 设置自动提交为关闭"SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED",  # 设置事务的隔离级别为 READ COMMITTED],
)

在这个例子中,我们使用 setsession 参数在每个连接创建后执行两个 SQL 语句。第一个语句是关闭自动提交(SET AUTOCOMMIT = 0),第二个语句是将事务的隔离级别设置为 READ COMMITTED(SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED)。这两个设置会在连接的整个生命周期中保持有效,直到连接被关闭。

需要注意的是,你的数据库用户需要有足够的权限来执行 setsession 中的 SQL 语句。如果没有足够的权限,连接创建会失败并抛出一个异常。

除了这些参数,PooledDB 的构造函数还会接受任何传递给 creator 的 connect 方法的参数。

PooledDB 构造函数的设计是非常灵活的,它允许你传入任何你需要的参数到 creator(数据库驱动)的 connect 方法。

creator 通常是一个数据库模块,它有一个 connect 方法用于创建数据库连接。这个 connect 方法的参数取决于你使用的数据库模块。例如,在使用 PyMySQL 时,connect 方法可能需要 hostuserpassworddatabase 等参数。

PooledDB 会把除了它自己的参数之外的所有参数都传递给 creatorconnect 方法。例如:

from DBUtils.PooledDB import PooledDB
import pymysqlpool = PooledDB(creator=pymysql,  # 数据库模块maxconnections=10,  # PooledDB 的参数host='127.0.0.1',  # connect 方法的参数user='root',  # connect 方法的参数password='password',  # connect 方法的参数database='test',  # connect 方法的参数
)

在这个例子中,maxconnectionsPooledDB 的参数,而 hostuserpassworddatabase 都是 connect 方法的参数。这些 connect 方法的参数会被 PooledDB 捕获,并在每次需要创建新的数据库连接时传递给 connect 方法。

这样的设计使得 PooledDB 能够很方便地与任何遵循 DB-API 规范的数据库模块一起使用,不论这个模块的 connect 方法需要哪些参数。

相关文章:

flask用DBUtils实现数据库连接池

flask用DBUtils实现数据库连接池 在 Flask 中,DBUtils 是一种实现数据库连接池的方案。DBUtils 提供了持久性(persistent)和透明的(transient)两种连接池类型。 首先你需要安装 DBUtils 和你需要的数据库驱动。例如&…...

SQL注入之布尔盲注

SQL注入之布尔盲注 一、布尔盲注介绍二、布尔盲注的特性三、布尔盲注流程3.1、确定注入点3.2、判断数据库的版本3.3、判断数据库的长度3.4、猜解当前数据库名称(本步骤需要重复)3.5、猜解数据表的数量3.6、猜解第一个数据表名称的长度3.7、猜解第一个数据…...

微服务入门---SpringCloud(一)

微服务入门---SpringCloud(一) 1.认识微服务1.0.学习目标1.1.单体架构1.2.分布式架构1.3.微服务1.4.SpringCloud1.5.总结 2.服务拆分和远程调用2.1.服务拆分原则2.2.服务拆分示例2.2.1.导入Sql语句2.2.2.导入demo工程 2.3.实现远程调用案例2.3.1.案例需求…...

Rust vs Go:常用语法对比(九)

题图来自 Golang vs Rust - The Race to Better and Ultimate Programming Language 161. Multiply all the elements of a list Multiply all the elements of the list elements by a constant c 将list中的每个元素都乘以一个数 package mainimport ( "fmt")func …...

Typescript 第五章 类和接口(多态,混入,装饰器,模拟final,设计模式)

第五章 类和接口 类是组织和规划代码的方式,是封装的基本单位。 typescript类大量借用了C#的相关理论,支持可见性修饰符,属性初始化语句,多态,装饰器和接口。 不过,由于Typescript将类编译成常规的JavaScri…...

IFNULL()COALESCE()

在 MySQL 中,IFNULL() 函数是可用的,但是请注意它不能直接用于聚合函数的结果。要在聚合函数结果可能为 NULL 的情况下返回特定值,应该使用 COALESCE() 函数而不是 IFNULL() 函数。 以下是代码示例: COALESCE(SUM(pc.CONTRACT_T…...

WPF实战学习笔记23-首页添加功能

首页添加功能 实现ITodoService、IMemoService接口&#xff0c;并在构造函数中初始化。新建ObservableCollection<ToDoDto>、 ObservableCollection<MemoDto>类型的属性&#xff0c;并将其绑定到UI中修改Addtodo、Addmemo函数&#xff0c;将添加功能添加 添加添加…...

OpenCV-Python常用函数汇总

OpenCV Python OpenCV简述显示窗口waitKey()&#xff1a;等待按键输入namedWindow()&#xff1a;创建窗口destroyWindow() &#xff1a;注销指定窗口destroyAllWindows() 注销全部窗口resizeWindow() 调整窗口尺寸 图像操作imread()&#xff1a;读取图像imwrite()&#xff1a;保…...

Vue-router多级路由

目录 直接通过案例的形式来演示多级路由的用法 文件结构 Banner.vue <template><div class"col-xs-offset-2 col-xs-8"><div class"page-header"><h2>Vue Router Demo</h2></div></div> </template><…...

前端学习--vue2--2--vue指令基础

写在前面&#xff1a; 前置内容 - vue配置 文章目录 插值表达式v-html条件渲染v-show和v-ifv-ifv-if的扩展标签复用组件 v-show v-on /事件v-bind /&#xff1a;属性v-modelv-for 循环元素v-slotv-prev-cloak vue指令只的是带有v-前缀的特殊标签属性 插值表达式 插值表达式{…...

【Python机器学习】实验03 logstic回归

文章目录 简单分类模型 - 逻辑回归1.1 准备数据1.2 定义假设函数Sigmoid 函数 1.3 定义代价函数1.4 定义梯度下降算法gradient descent(梯度下降) 1.5 绘制决策边界1.6 计算准确率1.7 试试用Sklearn来解决2.1 准备数据(试试第二个例子)2.2 假设函数与前h相同2.3 代价函数与前相…...

面试-杨辉三角python递归实现,二进制转换

杨辉三角 def yang_hui(x,y):xint(x)yint(y)assert x>y,列数不应该大于行数# x 表示行&#xff0c;y表示列if y1 or yx:return 1else:return yang_hui(x-1,y-1)yang_hui(x-1,y)xinput(输入第几行) yinput(输入第几列) resultyang_hui(int(x),int(y)) print(result) #inclu…...

SPEC CPU 2017 x86_64 Ubuntu 22.04 LTS LLVM 16.0.6 编译 intrate intspeed

源码编译llvm 下载源码 yeqiangyeqiang-MS-7B23:~/Downloads/src$ git clone --depth1 -b 7cbf1a2 https://github.com/llvm/llvm-project 正克隆到 llvm-project... warning: 不能发现要克隆的远程分支 7cbf1a2。 fatal: 远程分支 7cbf1a2 在上游 origin 未发现 yeqiangyeqi…...

java备忘录模式

在Java中&#xff0c;备忘录模式&#xff08;Memento Design Pattern&#xff09;用于捕获一个对象的内部状态并在该对象之外保存这个状态。备忘录模式允许在后续需要时将对象恢复到之前保存的状态&#xff0c;而不会暴露其内部结构。 备忘录模式包含以下主要角色&#xff1a;…...

iOS--runtime

什么是Runtime runtime是由C和C、汇编实现的一套API&#xff0c;为OC语言加入了面向对象、运行时的功能运行时&#xff08;runtime&#xff09;将数据类型的确定由编译时推迟到了运行时平时编写的OC代码&#xff0c;在程序运行过程中&#xff0c;最终会转换成runtime的C语言代…...

06. 管理Docker容器数据

目录 1、前言 2、Docker实现数据管理的方式 2.1、数据卷&#xff08;Data Volumes&#xff09; 2.2、数据卷容器&#xff08;Data Volume Containers&#xff09; 3、简单示例 3.1、数据卷示例 3.2、数据卷容器示例 1、前言 在生产环境中使用 Docker&#xff0c;一方面…...

计算机视觉常用数据集介绍

1 MINIST MINIST 数据集应该算是CV里面最早流行的数据了&#xff0c;相当于CV领域的Hello World。该数据包含70000张手写数字图像&#xff0c;其中60000张用于train&#xff0c; 10000张用于test&#xff0c; 并且都有相应的label。图像的尺寸比较小&#xff0c; 为28x28。 数…...

Arcgis画等高线

目录 数据准备绘制等高线3D等高线今天我们将学习如何在ArcGIS中绘制等高线地图。等高线地图是地理信息系统中常见的数据表现形式,它通过等高线将地形起伏展现得一目了然,不仅美观,还能提供重要的地形信息。 数据准备 在开始之前,确保已经准备好了高程数据,它通常以栅格数…...

abp vnext4.3版本托管到iis同时支持http和https协议

在项目上本来一直使用的是http协议,后来因为安全和一些其他原因需要上https协议&#xff0c;如果发布项目之后想同时兼容http和https协议需要更改一下配置信息&#xff0c;下面一起看一下&#xff1a; 1.安装服务器证书 首先你需要先申请一张服务器证书&#xff0c;申请后将证…...

2023年全网电视盒子无线ADB修改桌面(无需ROOT)

前言 1.主要是为了解决电视盒子等安卓设备无法卸载或者停用原始桌面导致无法选用第三方桌面。 解决方案 1.首先自行下载我提供的网盘APK 2.点击打开中国移动云盘 3.不管你是通过U盘还是局域网共享能够让你的电视安装第三方应用&#xff0c;毕竟每个品牌的安装方法不尽相同…...

什么是Java中的Maven?

Java中的Maven&#xff0c;可以简单理解为“一个神奇的工具”&#xff0c;它可以自动帮你管理Java项目的依赖关系&#xff0c;让你不再为手动下载、配置各种库而烦恼。想象一下&#xff0c;你正在写一个Java项目&#xff0c;突然发现需要引入一个名为"第三方库"的模块…...

【C++】总结7

文章目录 函数指针C中类成员的访问权限和继承权限问题定义和声明的区别C中类的静态成员与普通成员的区别是什么&#xff1f;虚函数为什么不能重载为内联函数&#xff1f;对ifdef endif的理解如何在不使用额外空间的情况下&#xff0c;交换两个数&#xff1f; 函数指针 什么是函…...

【前端知识】React 基础巩固(四十二)——React Hooks的介绍

React 基础巩固(四十二)——React Hooks的介绍 一、为什么需要Hook? Hook 是 React 16.8 的新增特性&#xff0c;它可以让我们在不编写class的情况下使用state以及其他的React特性&#xff08;比如生命周期&#xff09;。 class组件 VS 函数式组件&#xff1a; class的优势…...

adb命令丨adb push命令大全_adb操控手机和指令

【ADB命令】adb push命令总结 adb push命令大全操控手机和指令 运行在 Android 设备上的adb后台进程 执行 adb shell ps | grep adbd &#xff0c;可以找到该后台进程&#xff0c;windows 请使用 findstr 替代 grep [xuxu:~]$ adb shell ps | grep adbd root 23227 1 6672 8…...

【腾讯云 Cloud Studio 实战训练营】沉浸式体验编写一个博客系统

文章目录 前言项目中技术栈新建工作空间登录(注册)Cloud Studio 账号&#xff1a;进入 Cloud Studio 控制台&#xff1a;配置工作空间参数&#xff1a;确认并创建工作空间&#xff1a;项目搭建 配置nuxt 脚手架运行项目报错信息解决错误脚手架运行预览问题 开启博客代码配置lay…...

手机视频聊天分享

在人际互动的手机APP中&#xff0c;增加语音视频聊天功能是一个常见的需求。而现在&#xff0c;更进一步&#xff0c;在某些场景下&#xff0c;我们需要能将自己的手机屏幕分享给他人&#xff0c;或者是观看他人的手机屏幕。那么&#xff0c;这些常见的功能是如何实现的了&…...

神经网络小记-优化器

优化器是深度学习中用于优化神经网络模型的一类算法&#xff0c;其主要作用是根据模型的损失函数来调整模型的参数&#xff0c;使得模型能够更好地拟合训练数据&#xff0c;提高模型的性能和泛化能力。优化器在训练过程中通过不断更新模型的参数&#xff0c;使模型逐步接近最优…...

200+行代码写一个简易的Qt界面贪吃蛇

照例先演示一下&#xff1a; 一个简单的Qt贪吃蛇&#xff0c;所有的图片都是我自己画的&#xff08;得意&#xff09;。 大致的运行逻辑和之前那个200行写一个C小黑窗贪吃蛇差不多&#xff0c;因此在写这个项目的时候&#xff0c;大多情况是在想怎么通过Qt给展现出来。 背景图…...

redis中使用bloomfilter的白名单功能解决缓存穿透问题

一 缓存预热 1.1 缓存预热 将需要的数据提前缓存到缓存redis中&#xff0c;可以在服务启动时候&#xff0c;或者在使用前一天完成数据的同步等操作。保证后续能够正常使用。 1.2 缓存穿透 在redis中&#xff0c;查询redis缓存数据没有内容&#xff0c;接着查询mysql数据库&…...

Spring Boot 2.7.8以后mysql-connector-java与mysql-connector-j

错误信息 如果升级到Spring Boot 2.7.8&#xff0c;可以看到因为找不到mysql-connector-java依赖而出现错误。 配置&#xff1a; <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId>&l…...

廊坊做网站哪家好/必应搜索引擎地址

一 背景 最近在园子了浏览了几篇有关Socket文章&#xff0c;得到了一些启发萌生了想要重构公司在2000年用.NET Framework 2.0 与 Visual Studio 2005开发的AsySocket项目为了希望能够尽快的了解公司这个项目&#xff0c;Google了很多国内外的网站让我对Socket有了更深层次的了解…...

扬州广陵区建设局网站/的磁力搜索引擎

昨天有一个朋友来拜访我&#xff0c;他们公司想花巨资来建设企业IT。但是由于涉及到电商直销&#xff0c;涉及到企业生产、上游溯源、下游代理商管理&#xff0c;所以需求很复杂&#xff0c;他问我怎么开展比较好。所谓的巨资&#xff0c;是和他们企业销售流水相比的。所以&…...

优度公司做的网站/广州十大营销策划公司

线程同步与异步套接字编程1.事件对象上一次介绍了利用互斥对象实现线程同步 http://blog.csdn.net/walkerkalr/article/details/19510909。这次将继续介绍另两种线程同步的方法&#xff1a;事件对象和关键字代码段。1.1事件对象事件对象也属于内核对象&#xff0c;包括三个成员…...

做古玩的网站/2021年网络营销案例

其实我用过的&#xff0c;那一天晚上&#xff0c;看着摇摇欲坠的衣架&#xff0c;还有上次换床时留下的两根木头&#xff0c;突发奇想&#xff0c;用菜刀把木头给锯了&#xff0c;然后把衣架给修好了&#xff0c;用了两个小时。&#xff08;我的菜刀上有一道锯齿状的东西&#…...

什么是网站开发设计与实现/站长网站优化公司

微机原理实验总结不知不觉&#xff0c;微机原理与接口技术实验课程已经结束了。回想起来受益匪浅&#xff0c;主要是加深了对计算机的一些硬件情况和运行原理的理解和汇编语言的编写汇编语言&#xff0c;对于学习机电工程的自动控制和计算机都是很重要的&#xff0c;因为它是和…...

怎么免费做网站推广/百度seo怎么关闭

过年前后&#xff0c;中台概念又被推上风口浪尖&#xff01;被人诟病&#xff1a;太虚&#xff01;难落地&#xff01;坑大&#xff01;这是因为大部分中台布道以概念为主&#xff0c;或描绘一个互联网公司玩出花来的终极架构。但是传统企业更需要有一种模式&#xff0c;一种方…...