之前用 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 实现数据库连接池的更多相关文章

  1. Flask【第3篇】:蓝图、基于DBUtils实现数据库连接池、上下文管理等

    基于DBUtils实现数据库连接池 小知识: 1.子类继承父类的三种方式 class Dog(Animal): #子类 派生类 def __init__(self,name,breed, life_v ...

  2. 蓝图、基于DBUtils实现数据库连接池、上下文管理等

    基于DBUtils实现数据库连接池 小知识: 1.子类继承父类的三种方式 class Dog(Animal): #子类 派生类 def __init__(self,name,breed, life_v ...

  3. 3、flask之基于DBUtils实现数据库连接池、本地线程、上下文

    本篇导航: 数据库连接池 本地线程 上下文管理 面向对象部分知识点解析 1.子类继承父类__init__的三种方式 class Dog(Animal): #子类 派生类 def __init__(se ...

  4. flask之基于DBUtils实现数据库连接池、本地线程、上下文

    本篇导航: 数据库连接池 本地线程 上下文管理 面向对象部分知识点解析 1.子类继承父类__init__的三种方式 class Dog(Animal): #子类 派生类 def __init__(se ...

  5. Flask学习【第3篇】:蓝图、基于DBUtils实现数据库连接池、上下文管理等

    小知识 子类继承父类的三种方式 class Dog(Animal): #子类 派生类 def __init__(self,name,breed, life_value,aggr): # Animal. ...

  6. Flask系列(三)蓝图、基于DButils实现数据库连接池、上下文管理

    知识点回顾 1.子类继承父类的三种方式 class Dog(Animal): #子类 派生类 def __init__(self,name,breed, life_value,aggr): # Ani ...

  7. 基于DBUtils实现数据库连接池及flask项目部署

    阅读目录 flask中是没有ORM的,如果在flask里面连接数据库有两种方式 数据库连接池原理 模式一: 模式二: 数据库连接池 flask中是没有ORM的,如果在flask里面连接数据库有两种方式 ...

  8. Flask请求扩展和数据库连接池

    1.1.Flask之请求扩展 #!/usr/bin/env python # -*- coding:utf-8 -*- from flask import Flask, Request, render ...

  9. 基于DBUtils实现数据库连接池

    小知识: 1.子类继承父类的三种方式 class Dog(Animal): #子类 派生类 def __init__(self,name,breed, life_value,aggr): # Anim ...

  10. 12,DBUtils - Python数据库连接池

    创建数据库连接池: import time import pymysql import threading from DBUtils.PooledDB import PooledDB, SharedD ...

随机推荐

  1. go测试跨包代码覆盖率

    Golang虽然只是一门编程语言,但也为我们提供了不少工具,其中测试工具是最常用的,大概 前提概要 以前看书,只说了用什么工具去做覆盖率,和基本的使用,当时看了也没想太多.后面真正做项目了,老大要求比 ...

  2. Jupyter 使用安装的虚拟环境(tensorflow)

    1. 在 anaconda 中使用 conda create -n tensorflow python=3.6 创建 tensorflow 虚拟环境: 2. 安装交互环境(ipykernel)  co ...

  3. cJSON解析器总结[转载]

    一. 简介 cJson 是c语言编写的一个解析器. 是一个超轻巧,携带方便,单文件,简单的可以作为ANSI-C标准的JSON解析器.主要两个文件cJSON.c 和cJSON.h . 主要用来编码和解析 ...

  4. Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource could

    问题分析及解决方案 问题原因: Mybatis没有找到合适的加载类,其实是大部分spring - datasource - url没有加载成功,分析原因如下所示. DataSourceAutoConf ...

  5. Zookeeper - 客户端常用命令

    查看客户端命令帮助信息 查看Zookeeper的版本 查看使用过的历史命令 查看根目录下的znode 创建znode 查看节点信息 修改znode的内容 删除znode 关闭连接 连接客户端 退出客户 ...

  6. Twain Capabilities属性

    Asynchronous Device Events 异步设备事件 CAP_DEVICEEVENT MSG_SET选择应用程序希望Twain源报告的事件; MSG_RESET返回Twain源的首选设置 ...

  7. 报错:ReferenceError: __dirname is not defined in ES module scope

    报错: __dirname is not defined in ES module scope 前言 新版 NodeJS 支持通过 ESM 方式导入模块,代码如: // CommonJS 规范(旧) ...

  8. k8s dial tcp 127.0.0.1:6443: connect: connection refused排查流程及解决思路

    前言 k8s 集群中,使用 kubelet 报错,如下: The connection to the server 127.0.0.1:6443 was refused - did you speci ...

  9. 关于oracle pfile和spfile文件说明

    •Pfile(Parameter File,参数文件):是基于文本格式的参数文件,含有数据库的配置参数. 默认的名称为"init+例程名.ora",这是一个文本文件,可以用任何文本 ...

  10. 【软件】在Windows和Ubuntu上使用TFTP和NFS

    在Windows和Ubuntu上使用TFTP和NFS 零.介绍 最近在玩Linux开发板,在开发的过程中发现需要用到tftp和nfs来帮助传输文件,故此记录如何使用这两种软件. TFTP(Trivia ...