Flask 中用 dbutils 实现数据库连接池
之前用 dbutils 来实现数据库连接池, 这里将其封装为一个自定义类并在 flask 中实际应用一下, 在实际场景中肯定是多页面接口, 这也就涉及到 python 的 import 问题, 就个人感觉它没有像 js 那样方便, 但也能用吧.
目录结构
- app.py
- config
- __ init __.py
- db.py
- goods
- __ init __.py
- views.py
简单说明如下:
app.py 用来作为主程序入口, 实例化 app , 注册蓝图, 和简单配置.
config 是个文件夹, 因其带有 __ init __ .py 文件则变成了一个 package, 可以轻松 import 了.
goods 是一个业务板块, 业务逻辑视图都放在 view.py, 而 __ init __ 的作用则是向外 export 暴露 views 视图里面的东西能更好被 find 而已.
具体实现
app.py
from flask import Flask
import goods
app = Flask(__name__)
# 注册蓝图
app.register_blueprint(goods.blueprint)
# app.register_blueprint(products.blueprint)
@app.route('/')
def index():
return 'hello, youge!'
if __name__ == "__main__":
app.config['debug'] = True
app.config['JSON_AS_ASCII'] = False
# run 一定要在最后, 配置才会生效
app.run(host='127.0.0.1', debug=True)
这里能 import goods, 说明 goods 是一个 package, 然后会从它的 __ init __ .py 中去慢慢寻找成员
蓝图管理 goods.blueprint 这里的 blueprint 是一个自定义名字的蓝图对象实例, 表示这块业务的二级路由规划等.
goods.__ init __.py
from goods.views import *
它的作用是向外 export 其同级目录下的 views.py 视图函数中的各成员, 同时也声明 goods 是个 pakage, 然后也做代理结构拆分, 让人一看就懂.
goods.views.py
from flask import Blueprint, jsonify
from config.db import db
# 用这个 bluprint 管理这下面一连串的业务逻辑路径
blueprint = Blueprint('goods', __name__, url_prefix='/goods')
@blueprint.route("/test/")
def test():
return jsonify([1, 2, 3])
@blueprint.route("/sales/")
def cate_sales():
sql = "select 类别, round(sum(销售额),2) as 销售额 from market group by 1;"
data = db.fetchall(sql)
return jsonify(data)
这里的 blueprint 是一个蓝图实例, 用来管理下面一连串的路由 url 前缀都是 '/goods/xxx' 的方式.
获取数据这里用了原生 sql 并进行了封装, 然后返回一个 json 数据, 因此核心是来看这个 db 对象实例是如何实现的.
config.__ init __.py
# 啥都不写也行
from config.db import *
作用同上, 声明 config 是一个 package, 然后顺带将 下面的 db.py 中的成员都 export 出去, 能被外面的文件进行 import
config.db.py
import pymysql
from pymysql import cursors
from dbutils.pooled_db import PooledDB
# 通过类来创建单例模式封装 DB
class DB(object):
def __init__(self):
self.pool = PooledDB(
creator=pymysql,
# 创建最大连接
maxconnections=6,
mincached=2,
maxcached=3,
maxshared=4,
blocking=True,
maxusage=None,
setsession=[],
ping=0,
# 这一坨会传给上面的 pymysql
host='127.0.0.1',
port=3306,
user='root',
passwd='123456',
database='cj',
charset='utf8',
# 让查询结果是一个 dict
cursorclass=cursors.DictCursor
)
def execute(self, sql, args=None):
# 从连接池获取连接
conn = self.pool.connection()
res = None
try:
cursor = conn.cursor()
cursor.execute(sql, args)
if sql.startswith('select'):
res = cursor.fetchall()
else:
# insert, delete , update 都要提交
conn.commit()
except Exception as e:
conn.rollback()
raise e
finally:
# 将连接归还给连接池, 但并非是关闭连接, 不会造成反复连接数据库
conn.close()
return res
# 类实例化 DB 对象, 即也是单例创建一个连接池啦
db = DB()
重点在最后这一行, db = DB( ) 即通过类实例化的方式完成了一个单例. 即对于连接池一共只创建了一个, 但在各个地方都能用上.
演示结果
首页:

业务:

还是蛮好理解和使用的, 后面就用它来写接口吧.
Flask 中用 dbutils 实现数据库连接池的更多相关文章
- Flask【第3篇】:蓝图、基于DBUtils实现数据库连接池、上下文管理等
基于DBUtils实现数据库连接池 小知识: 1.子类继承父类的三种方式 class Dog(Animal): #子类 派生类 def __init__(self,name,breed, life_v ...
- 蓝图、基于DBUtils实现数据库连接池、上下文管理等
基于DBUtils实现数据库连接池 小知识: 1.子类继承父类的三种方式 class Dog(Animal): #子类 派生类 def __init__(self,name,breed, life_v ...
- 3、flask之基于DBUtils实现数据库连接池、本地线程、上下文
本篇导航: 数据库连接池 本地线程 上下文管理 面向对象部分知识点解析 1.子类继承父类__init__的三种方式 class Dog(Animal): #子类 派生类 def __init__(se ...
- flask之基于DBUtils实现数据库连接池、本地线程、上下文
本篇导航: 数据库连接池 本地线程 上下文管理 面向对象部分知识点解析 1.子类继承父类__init__的三种方式 class Dog(Animal): #子类 派生类 def __init__(se ...
- Flask学习【第3篇】:蓝图、基于DBUtils实现数据库连接池、上下文管理等
小知识 子类继承父类的三种方式 class Dog(Animal): #子类 派生类 def __init__(self,name,breed, life_value,aggr): # Animal. ...
- Flask系列(三)蓝图、基于DButils实现数据库连接池、上下文管理
知识点回顾 1.子类继承父类的三种方式 class Dog(Animal): #子类 派生类 def __init__(self,name,breed, life_value,aggr): # Ani ...
- 基于DBUtils实现数据库连接池及flask项目部署
阅读目录 flask中是没有ORM的,如果在flask里面连接数据库有两种方式 数据库连接池原理 模式一: 模式二: 数据库连接池 flask中是没有ORM的,如果在flask里面连接数据库有两种方式 ...
- Flask请求扩展和数据库连接池
1.1.Flask之请求扩展 #!/usr/bin/env python # -*- coding:utf-8 -*- from flask import Flask, Request, render ...
- 基于DBUtils实现数据库连接池
小知识: 1.子类继承父类的三种方式 class Dog(Animal): #子类 派生类 def __init__(self,name,breed, life_value,aggr): # Anim ...
- 12,DBUtils - Python数据库连接池
创建数据库连接池: import time import pymysql import threading from DBUtils.PooledDB import PooledDB, SharedD ...
随机推荐
- Linux嵌入式设备怎么确定网络端口的速率
Linux嵌入式设备怎么确定网络端口的速率 突发奇想,就是Linux下面我能不能查询到端口的速率,以此来判断要不要频繁的发送网络数据包呢? 或者更换包利用率更高的协议呢. 于是抱着这样的想法,我开始学 ...
- 泰山派(Linux)播放音乐
泰山派(Linux)录音/播放音乐 alsamixer 声卡: 播放:play(较详细),aplay 录音:arecord 麦克风可用: Main_mic可用 录音(wav/mp3) ar ...
- 生成式 AI 的发展方向,是 Chat 还是 Agent?
一.整体介绍 生成式 AI 在当今科技领域的发展可谓是日新月异,其在对话系统(Chat)和自主代理(Agent)两个领域都取得了显著的成果. 在对话系统(Chat)方面,发展现状令人瞩目.当前,众多智 ...
- Flume - [04] Hive Sink
一.概述 HIVE Sink 将包含分割文本或JSON数据的事件直接流到Hive表或分区中.事件是使用Hive事务编写的.一旦一组事件被提交到Hive,它们就会立即对hive查询可见.流到其中的分 ...
- Linux系统下nginx的安装与卸载
1.1 安装 准备依赖环境 1.安装 gcc 依赖库 yum install gcc-c++ 2.安装 PCRE pcre-devel 依赖库 yum install -y pcre pcre-dev ...
- php实现地址跳转的方式
在PHP中,实现地址跳转主要有以下几种方式: 1. 使用 header() 函数 header() 函数用于发送原始的 HTTP 头信息,常用于实现页面跳转. <?php header(&quo ...
- composer 2 升级操作
update composer composer self-update // or sudo composer self-update 回滚到版本1 composer self-update --r ...
- MongoDB 简单介绍
MongoDB介绍 疑问 解答 什么是 MongoDB 一个以 JSON 为数据模型的文档数据库 为什么叫文档数据库? 文档来自于 "JSON Document",并非我们一般理解 ...
- 有关js的双向绑定解除方法
最近碰到了一个bug var persons = [{ number: 1, age: 11, name: "wanghaha", money: -1 }, { number: 2 ...
- 昨晚接收的俄罗斯Meteor-M2气象卫星云图,接收质量还可以!
接收设备: 天馈:自制四臂螺旋天线 硬件:SDRsharp 跟踪:Orbitron.SDRSharpDriverDDE 频率:137.1MHZ 解码:SDRSharp.QPSK.M2_LRPT_Dec ...