flask数据库连接

发布时间 2023-04-04 16:40:26作者: leethon

flask数据库连接

flask连接数据库

flask连接数据库需要借助pymysql模块,相当于一个mysql的客户端连接。

那么问题来了,我们应该按照什么策略去连接数据库?

  1. 来一个请求连一次,请求处理完后断开数据库连接

    当并发量过高时,会有数据库服务端无法处理的隐患

    且每次请求都重新连接数据库一次效率会很低。

  2. 只连一次,全局使用

    不需要每次重新连接了,但是会出现新的问题,由于使用相同的连接,一个请求查询语句的数据结果可能会被其他请求取走,导致更严重的问题——数据错乱。

  3. 建立数据库连接池,每次请求从既有的连接池中取一个mysql服务去执行sql,当处理完后才释放掉此服务供给其他请求使用。而数据库池被完全占用时,其他请求需要等待。

    这样就既缓解了第一种策略的连接效率低的问题,又避免了第二种策略会出现的数据错乱问题。

dbutils建立数据库连接池

dbutils是一个第三方模块:

pip install dbutils

dbutils基本使用:

from dbutils.pooled_db import PooledDB
import pymysql


POOL = PooledDB(
    creator=pymysql,  # 数据库模块(必填)
    mincached=config.DB_MIN_CACHED,  # 最小闲置连接数
    maxcached=config.DB_MAX_CACHED,  # 最大闲置连接数
    maxshared=config.DB_MAX_SHARED,  # 最大共享连接数
    maxconnections=config.DB_MAX_CONNECYIONS,  # 允许的最大连接数(0或None不做限制)
    blocking=config.DB_BLOCKING,  # 连接达到最大时是选择阻塞(true)还是返回报错(false)
    maxusage=config.DB_MAX_USAGE,  # 单个连接最大复用数(0表示不限制)
    setsession=config.DB_SET_SESSION,  # 一个可选的SQL命令列表用于准备每个会话,如["set datestyle to german", ...]
    host=config.DB_TEST_HOST,  # 连接的ip地址
    port=config.DB_TEST_PORT,  # 连接的端口
    user=config.DB_TEST_USER,  # 连接的用户名
    passwd=config.DB_TEST_PASSWORD,  # 连接的密码
    db=config.DB_TEST_DBNAME,  # 连接的数据库名
    use_unicode=False,  
    charset=config.DB_CHARSET  # 字符编码
)

conn = POOL.connection()  # 从池子里取一个连接
cursor = conn.cursor(pymysql.cursors.DictCursor)  # 产生游标
cursor.execute('sql语句')  # 执行游标
res = cursor.fetchall()  # sql有返回值还可以拿到结果
cursor.close()
conn.close()  # 将连接归还连接池

flask使用单例配置数据库连接池:

##### db_pool.py
from dbutils.pooled_db import PooledDB

POOL = PooledDB(...)

##### 使用到sql的地方
from db_pool import POOL
...
@app.route('/query')
def query():
    conn = POOL.connection()
    cursor = conn.cursor(pymysql.cursors.DictCursor)  # 产生游标
    cursor.execute('sql语句')  # 执行游标
    res = cursor.fetchall()  # sql有返回值还可以拿到结果
    cursor.close()
    conn.close()  # 将连接归还连接池
    return jsonify(res)