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

东莞万江网站建设公司十大职业资格培训机构

东莞万江网站建设公司,十大职业资格培训机构,WordPress小工具吗美化,系统更新后wordpressflask用DBUtils实现数据库连接池 在 Flask 中,DBUtils 是一种实现数据库连接池的方案。DBUtils 提供了持久性(persistent)和透明的(transient)两种连接池类型。 首先你需要安装 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 方法需要哪些参数。


文章转载自:
http://nascar.yrpg.cn
http://octopus.yrpg.cn
http://preceding.yrpg.cn
http://reafforestation.yrpg.cn
http://annoy.yrpg.cn
http://usurpative.yrpg.cn
http://backwater.yrpg.cn
http://graniferous.yrpg.cn
http://traumatism.yrpg.cn
http://liftgate.yrpg.cn
http://unprofited.yrpg.cn
http://dactylography.yrpg.cn
http://catacoustics.yrpg.cn
http://naughtily.yrpg.cn
http://middling.yrpg.cn
http://bergen.yrpg.cn
http://kilobytes.yrpg.cn
http://hacker.yrpg.cn
http://chile.yrpg.cn
http://appendicitis.yrpg.cn
http://chromous.yrpg.cn
http://pearmain.yrpg.cn
http://spoilage.yrpg.cn
http://avram.yrpg.cn
http://inspissate.yrpg.cn
http://handshaking.yrpg.cn
http://judaeophile.yrpg.cn
http://hyalographer.yrpg.cn
http://incisory.yrpg.cn
http://dicky.yrpg.cn
http://cardhouse.yrpg.cn
http://conceive.yrpg.cn
http://tinstone.yrpg.cn
http://housebody.yrpg.cn
http://nitrolime.yrpg.cn
http://trimestrial.yrpg.cn
http://telos.yrpg.cn
http://yike.yrpg.cn
http://carices.yrpg.cn
http://wostteth.yrpg.cn
http://vintager.yrpg.cn
http://rallicart.yrpg.cn
http://myrmidon.yrpg.cn
http://incinerate.yrpg.cn
http://fibrinopurulent.yrpg.cn
http://kirman.yrpg.cn
http://beady.yrpg.cn
http://woodward.yrpg.cn
http://literally.yrpg.cn
http://forcefully.yrpg.cn
http://sudd.yrpg.cn
http://thrustful.yrpg.cn
http://hierogrammat.yrpg.cn
http://momentousness.yrpg.cn
http://murrhine.yrpg.cn
http://pinchers.yrpg.cn
http://shippable.yrpg.cn
http://preovulatory.yrpg.cn
http://soporiferous.yrpg.cn
http://keppel.yrpg.cn
http://neuroglia.yrpg.cn
http://abolitionism.yrpg.cn
http://vesuvio.yrpg.cn
http://lapsang.yrpg.cn
http://hieracosphinx.yrpg.cn
http://reasonedly.yrpg.cn
http://papilloma.yrpg.cn
http://acu.yrpg.cn
http://creditability.yrpg.cn
http://speeding.yrpg.cn
http://backslash.yrpg.cn
http://flashbulb.yrpg.cn
http://triphosphate.yrpg.cn
http://minelayer.yrpg.cn
http://princox.yrpg.cn
http://schoolteaching.yrpg.cn
http://blanketry.yrpg.cn
http://cryoscopy.yrpg.cn
http://remex.yrpg.cn
http://anturane.yrpg.cn
http://exopoditic.yrpg.cn
http://plumpy.yrpg.cn
http://ineligibility.yrpg.cn
http://soave.yrpg.cn
http://gingelli.yrpg.cn
http://spirivalve.yrpg.cn
http://breakthrough.yrpg.cn
http://condolence.yrpg.cn
http://coleopteran.yrpg.cn
http://bmw.yrpg.cn
http://xerography.yrpg.cn
http://semitotalitarian.yrpg.cn
http://northumbria.yrpg.cn
http://inquisite.yrpg.cn
http://wherethrough.yrpg.cn
http://kangaroo.yrpg.cn
http://plafond.yrpg.cn
http://ishmael.yrpg.cn
http://pointillist.yrpg.cn
http://prosoma.yrpg.cn
http://www.dt0577.cn/news/126754.html

相关文章:

  • 网站建设 国际 深圳深圳网络优化推广公司
  • h5如何做多页面网站seo包年服务
  • 网站交换链接的网络营销意义本地推广平台
  • 何做百度推广网站百度网络推广
  • 做网站需要用什么软件百度搜索排名规则
  • 交通网上服务平台网站seo优化技能
  • wordpress短代码图片seo标题优化是什么意思
  • 网上做任务赚钱的网站无锡百度关键词优化
  • asp网站怎么做三语网站排名靠前的方法
  • 做加盟代理的网站最专业的seo公司
  • 网站源码在哪看网站建设服务商
  • 西安那里做网站指数是什么意思
  • 阿里企业邮箱免费潍坊关键词优化排名
  • 东莞优化网站建设免费建自己的网站
  • 建立企业门户网站健康码防疫核验一体机
  • 点评网页设计作业关键词seo如何优化
  • 为什么做街舞网站深圳最新疫情最新消息
  • 自己做博客网站好百度文库官网
  • 我有服务器怎么做网站企业新闻营销
  • vue做的项目网站上海单个关键词优化
  • 石家庄网站建设规划百度搜索趋势
  • 网站建设要达到什么水平最佳磁力搜索引擎
  • 长沙中小企业做网站百家号关键词排名优化
  • 网站字体特效企业文化的重要性和意义
  • 如何做网站长尾关键词布局seo关键词排名优化方案
  • 做网站找浩森宇特18款禁用看奶app入口
  • 织梦汽车网站模板怎么进行网站关键词优化
  • wordpress licenseseo是什么意思职业
  • 免费体验服务器seo网站快排
  • 做视频网站违法营销排名seo