【问题标题】:Flask SQLAlchemy display queries for debugFlask SQLAlchemy 显示查询以进行调试
【发布时间】:2012-09-11 12:03:33
【问题描述】:

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

最好的方法是什么?

【问题讨论】:

    标签: sqlalchemy flask


    【解决方案1】:

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

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

    【讨论】:

    • 您好,启用后在哪里可以找到此日志?编辑:它在命令行/终端中
    【解决方案2】:
    app.config['SQLALCHEMY_ECHO'] = True
    

    【讨论】:

      【解决方案3】:

      我自己没用过,不过似乎 Flask Debug-toolbar 可以帮上忙。

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

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

      【讨论】:

      • 它有效。您只需要使用 sql alchemy 扩展设置 sqlalchemy,调试工具栏就会选择它。谢谢
      • 如果您想对查询执行其他操作,则在查询对象上调用 str() 将为您提供查询的字符串表示形式,您可以随心所欲地执行任何操作。它可能不包含参数化值,但您将能够看到查询结构。
      【解决方案4】:

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

      【讨论】:

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

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

        SQLALCHEMY_RECORD_QUERIES = True

        FLASKY_SLOW_DB_QUERY_TIME = 0.5

        【讨论】:

          【解决方案6】:

          其他答案仅适用于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!
          

          如果不手动将它们连接到您的项目中,解释/选择端点将无法工作,但至少您的查询调试器(计数和 sql)可以工作。我试图了解我的炼金术正在形成什么样的查询,我明白了。

          【讨论】:

          • 请注意,这仍然需要安装 Flask-SQLAlchemy 扩展,因为它使用了其中的多种方法。
          【解决方案7】:

          如果您使用自己的 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': ...
                 }
             }
          })
          

          【讨论】:

            【解决方案8】:

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

            【讨论】:

              猜你喜欢
              • 2014-10-09
              • 2013-07-24
              • 2014-01-02
              • 2014-05-18
              • 2018-01-16
              • 2019-08-25
              • 2019-04-23
              • 2019-12-13
              • 2017-08-28
              相关资源
              最近更新 更多