Flask SQLAlchemy显示调试查询

时间:2012-09-11 12:03:33

标签: sqlalchemy flask

我正在使用flask和SQL Alchemy开发一个应用程序。 我需要显示执行的查询以生成一个页面以及每个查询用于调试的时间

最好的方法是什么?

8 个答案:

答案 0 :(得分:87)

如果您使用的是Flask-SQLAlchemy扩展程序,并且不想打扰create_engine,则可以设置配置键SQLALCHEMY_ECHO=True

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

答案 1 :(得分:43)

app.config['SQLALCHEMY_ECHO'] = True

答案 2 :(得分:12)

我自己没有使用它,但看起来Flask Debug-toolbar可能对此有帮助。

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

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

答案 3 :(得分:6)

延迟回复但在sqlalchemy create_engine中设置“echo = True”会记录执行的查询和时间。

答案 4 :(得分:3)

其他答案仅适用于flask_sqlalchemy,而非flasksqlalchemy

如果您想使用原生SQLAlchemy,可以快速解决此问题:http://yuji.wordpress.com/2014/01/07/use-native-sqlalchemy-in-flask-debugtoolbar/

from flask.ext.sqlalchemy import _EngineDebuggingSignalEvents
_EngineDebuggingSignalEvents(engine, app.import_name).register()
# use at your own risk! a development environment shouldn't really care though!

如果没有手动将它们连接到项目中,解释/选择端点不起作用,但至少您的查询调试器(count和sql)有效。我试图了解我的炼金术正在形成什么样的问题,我得到了它。

答案 5 :(得分:2)

我不确定是否要从中生成网页,但是调试/记录数据库查询的一种好方法是使用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

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

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

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

SQLALCHEMY_RECORD_QUERIES = True

FLASKY_SLOW_DB_QUERY_TIME = 0.5

答案 6 :(得分:1)

如果您使用自己的python日志记录配置,则可能只需要set the level of the 'sqlalchemy.engine' logger to 'INFO' in your config

配置python日志记录的方法有很多,但这里有一个示例using logging.config.dictConfig()

import logging.config

logging.config.dictConfig({
   ...
   'loggers': {
       'sqlalchemy.engine': {
           'level': 'INFO',
           'handlers': ...
       }
   }
})

答案 7 :(得分:0)

除了Cawb07的答案,它为我解决了它,请确保你有 在重定向之前查询时,DEBUG_TB_INTERCEPT_REDIRECTS设置为True。