Flask(web)使用sqlalchemy查看sql语句的性能
如果程序性能随着时间推移不断降低,那很有可能是因为数据库查询变慢了,随着数据库规模的增长,这一情况还会变得更加严重。普通优化其实很简单,只需添加合适的索引,不过在开始优化查询之前,我们必须知道那些查询是值得优化的。可以在数据库中explain对应查询语句但是这样实在太慢而且让人感觉恶心,这时就完全可以使用Flask的请求钩子函数配合sqlalchemy进行查询语句的相关统计。
from flask.ext.sqlalchemy import get_debug_queries @app.after_request def af_request(response): for query in get_debug_queries(): if query.duration >= current_app.config['FALSK_SLOW_DB_QUERY_TIME']: current_app.logger.warning( 'Slow query: %s\nParameters: %s\nDuration: %fs\nContext: %s\n' %(query.statement, query.parameters, query.duration, query.context) ) return response
这个功能使用after_app_requestq请求钩子实现的,在视图函数处理完成之后执行。Flask把响应对象传给after_app_request处理程序,以防修改响应。
本例中after_app_request只是获取flak_sqlalchemy记录的查询时间并把运行缓慢的的查询写入日志。
默认情况下,get_debug_queries()函数只在调试模式中可用。