Flask SQLAlchemy显示调试查询

app*_*ief 43 sqlalchemy flask

我正在开发一个带烧瓶和SQL Alchemy的应用程序.我需要显示执行的查询以生成一个页面以及每个查询调试所用的时间

最好的方法是什么?

Caw*_*b07 94

如果您正在使用Flask扩展并且不想使用create_engine,则可以设置配置键create_engine.

http://flask-sqlalchemy.pocoo.org/2.1/config/


Pet*_*ton 54

app.config['SQLALCHEMY_ECHO'] = True
Run Code Online (Sandbox Code Playgroud)


jev*_*ing 15

我自己没有使用它,但似乎Flask Debug-toolbar可能对此有所帮助.

https://github.com/mgood/flask-debugtoolbar

它是django-debug-toolbar的一个端口,可用于分析查询.Flask Debug-toolbar的文档没有提到它,但是有一个SQLAlchemyDebugPanel的代码.
所以我认为看看这个项目可能是值得的,看看它是否能满足您的需求.

  • 有用.您只需要使用sql炼金术扩展设置sqlalchemy,调试工具栏就会将其选中.谢谢 (2认同)

use*_*829 8

延迟回复但在sqlalchemy create_engine中设置"echo = True"将记录执行的查询和时间.


Tyr*_*tyk 5

我不确定是否可以从中生成网页,但是调试/记录数据库查询的一种好方法是使用 SQLAlchemy 的 get_debug_queries()。

## in app/main/views.py . (my app's main endpoint file)
from flask import current_app
from flask_sqlalchemy import get_debug_queries

@main.after_app_request
def after_request(response):
    for query in get_debug_queries():
        if query.duration >= current_app.config['FLASKY_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
Run Code Online (Sandbox Code Playgroud)

这里发生了很多事情,让我们分解一下:

  • @after_app_request 装饰器确保在请求关闭之前调用此函数。
  • 该函数接收flask 的响应对象,并遍历get_debug_queries() 的返回值,它返回一个列表。
  • 它检查每一个的持续时间,并将其与预定义的配置变量进行比较(我将我的设置为 0.5,以秒为单位)。
  • 最后,它将查询及其属性记录到标准烧瓶记录器对象(记录的位置取决于您的应用程序配置)。

不要忘记在 config.py Config 类中设置配置变量:

SQLALCHEMY_RECORD_QUERIES = True

FLASKY_SLOW_DB_QUERY_TIME = 0.5