首页 > 数据库 >Flask 中用 dbutils 实现数据库连接池

Flask 中用 dbutils 实现数据库连接池

时间:2023-04-29 12:05:33浏览次数:40  
标签:__ goods Flask app db cursor import dbutils 连接池

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 open(self):
        conn = self.pool.connection()
        cursor = conn.cursor()
        return conn, cursor
    
    def close(slef, cursor, conn):
        cursor.close()
        conn.close()

    def fetchall(self, sql, *args):
        conn, cursor = self.open()
        cursor.execute(sql, args)
        data = cursor.fetchall()
        self.close(conn, cursor)
        return data 
    
    def fetchone(self, sql, *args):
        conn, cursor = self.open()
        cursor.execute(sql, args)
        data = cursor.fetchone()
        self.close(conn, cursor)
        return data 


# 类实例化 DB 对象, 即也是单例创建一个连接池啦
db = DB()

重点在最后这一行, db = DB( ) 即通过类实例化的方式完成了一个单例. 即对于连接池一共只创建了一个, 但在各个地方都能用上.

演示结果

首页:

Flask 中用 dbutils 实现数据库连接池_flask

业务:

Flask 中用 dbutils 实现数据库连接池_flask_02

还是蛮好理解和使用的, 后面就用它来写接口吧.

耐心和恒心, 总会获得回报的.



标签:__,goods,Flask,app,db,cursor,import,dbutils,连接池
From: https://blog.51cto.com/u_14195239/6236693

相关文章

  • 数据库连接池 - Pymysql
    数据库连接池+pymysql最近想用小程序来做个移动BI,然后涉及后端接口部分打算用Python的flask框架整一波,主要听闻它比较轻量,简单和可灵活配置,这就和我很对味.毕竟我主要搞数据用的就是sql而已,只要有个服务器提供接口就行.真正开始来写接......
  • Flask框架 之基于光年后端框架的权限管理系统,可用于前后端开发
    一、效果图二、下载https://gitee.com/yang1015/flask-rbac2......
  • Flask, set a cookie and then re-direct user
    @app.route('/login',methods=['POST','GET'])deflogin():errors=[]ifrequest.method=='POST':email=request.form['email']password=request.form['password']#Checkthe......
  • struts 1.2 struts连接池河dbcp连接池所要用的3个jar包
    连接池struts-config.xml里配置<struts-config>下<data-sources> <data-sourcekey="mysqlDB"type="org.apache.commons.dbcp.BasicDataSource"> <set-propertyproperty="driverClassName" val......
  • flask简单实现
    一、flask简介二、flask安装及简单实现三、问题 一、flask简介Flask本身相当于一个内核,其他几乎所有的功能都要用到扩展(邮件扩展Flask-Mail,用户认证Flask-Login,数据库Flask-SQLAlchemy),都需要用第三方的扩展来实现。比如可以用Flask扩展加入ORM、窗体验证工具,文件......
  • 七天学会flask(六)---模板-行语句(3)(第一天)
    flask模板技术---行语句flask行语句,可以让模板的代码编写更加容易便捷,不然总是用{%...%}来标识挺麻烦的,使用行语句首先需要进行设置app.jinja_env.line_statement_prefix='#'先来看一下不使用行语句时如何写一段for循环{%foriinrange(10)%}<p>{{i}}</p>......
  • 七天学会flask(六)---模板-转义(3)(第一天)
    flask模板技术---转义Jinja自动根据模板语法进行html渲染,但某些时候,我们不希望它进行渲染,原因在于一旦渲染,其结果并不是我们所期望的,比如下面这段html<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>Title</title></head><b......
  • 两天学会flask(六)---模板-上下文环境(3)(20分钟)
    flask模板---上下文环境在前面的示例中,想要在模板里显示数据,只能通过在render_template函数里传参数来解决。但对于flask的上下文变量和自定义上下文变量,则不必如此,你可以直接在模板里使用他们。1.request请求对象request,携带了大量有关请求的信息,比如请求的path,url,参数,你可以......
  • (完结篇)Python web框架FastAPI——一个比Flask和Tornada更高性能的API 框架
    今日鸡汤借问酒家何处有,牧童遥指杏花村。0前言    前几天给大家分别分享了(入门篇)简析Pythonweb框架FastAPI——一个比Flask和Tornada更高性能的API框架和(进阶篇)Pythonweb框架FastAPI——一个比Flask和Tornada更高性能的API框架。今天欢迎大家来到FastAPI系列分享的完结篇......
  • 数据库连接池 - Pymysql
    最近想用小程序来做个移动BI,然后涉及后端接口部分打算用Python的flask框架整一波,主要听闻它比较轻量,简单和可灵活配置,这就和我很对味.毕竟我主要搞数据用的就是sql而已,只要有个服务器提供接口就行.真正开始来写接口的时候,就遇到这个数据库的问题,关于查询效......