58

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

最好的方法是什么?

4

8 回答 8

121

如果你正在使用 Flask-SQLAlchemy 扩展并且不想打扰create_engine,你可以设置配置键SQLALCHEMY_ECHO=True

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

于 2014-08-01T20:25:09.243 回答
75
app.config['SQLALCHEMY_ECHO'] = True
于 2014-09-28T21:04:01.303 回答
18

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

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

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

于 2012-09-11T12:26:04.603 回答
9

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

于 2014-02-27T06:34:58.583 回答
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

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

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

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

SQLALCHEMY_RECORD_QUERIES = True

FLASKY_SLOW_DB_QUERY_TIME = 0.5

于 2018-06-21T17:31:15.430 回答
3

另一个答案仅适用于flask_sqlalchemy,不适用于flaskand sqlalchemy

如果您想使用 native 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)可以工作。我试图了解我的炼金术正在形成什么样的查询,我明白了。

于 2014-01-07T22:11:43.623 回答
3

如果您使用自己的 python 日志记录配置,您可能只想在 config 中将“sqlalchemy.engine”记录器的级别设置为“INFO”

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

import logging.config

logging.config.dictConfig({
   ...
   'loggers': {
       'sqlalchemy.engine': {
           'level': 'INFO',
           'handlers': ...
       }
   }
})
于 2016-03-18T17:03:52.653 回答
0

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

于 2017-08-21T11:13:25.043 回答