我正在使用flask和SQL Alchemy开发一个应用程序。 我需要显示执行的查询以生成一个页面以及每个查询用于调试的时间
最好的方法是什么?
答案 0 :(得分:87)
如果您使用的是Flask-SQLAlchemy扩展程序,并且不想打扰create_engine
,则可以设置配置键SQLALCHEMY_ECHO=True
。
答案 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
,而非flask
和sqlalchemy
。
如果您想使用原生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
这里发生了很多事情,让我们分解一下:
不要忘记在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。