flask数据库连接
flask数据库连接
flask连接数据库
flask连接数据库需要借助pymysql模块,相当于一个mysql的客户端连接。
那么问题来了,我们应该按照什么策略去连接数据库?
-
来一个请求连一次,请求处理完后断开数据库连接
当并发量过高时,会有数据库服务端无法处理的隐患
且每次请求都重新连接数据库一次效率会很低。
-
只连一次,全局使用
不需要每次重新连接了,但是会出现新的问题,由于使用相同的连接,一个请求查询语句的数据结果可能会被其他请求取走,导致更严重的问题——数据错乱。
-
建立数据库连接池,每次请求从既有的连接池中取一个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)