显示Flask-SQLAlchemy生成的SQL

问题描述 投票:7回答:3

我想获得Flask-SQLAlchemy查询发出的SQL。在Django中,我可以打印query属性来获取SQL。如何在Flask中获得类似的东西?

# django
>>> queryset = MyModel.objects.all()
>>> print queryset.query
SELECT "myapp_mymodel"."id", ... FROM "myapp_mymodel"
python flask flask-sqlalchemy
3个回答
9
投票

Flask-SQLAlchemy在请求期间记录有关所有查询的调试信息。您可以通过get_debug_queries()获取信息。例如,Flask-Debugtoolbar使用它来提供一个调试面板,在每个页面渲染上都有查询定时信息。

get_debug_queries()按照执行顺序返回查询列表。

>>> from my_app import User
>>> from flask_sqlalchemy import get_debug_queries
>>> User.query.filter_by(display_name='davidism').all()
>>> info = get_debug_queries()[0]
>>> print(info.statement, info.parameters, info.duration, sep='\n')
SELECT "user".id AS user_id, se_user.id AS se_user_id, se_user.display_name AS se_user_display_name, se_user.profile_image AS se_user_profile_image, se_user.profile_link AS se_user_profile_link, se_user.reputation AS se_user_reputation, "user".superuser AS user_superuser \nFROM se_user JOIN "user" ON se_user.id = "user".id \nWHERE se_user.display_name = %(display_name_1)s
{'display_name_1': 'davidism'}
0.0016849040985107422

如果SQLALCHEMY_RECORD_QUERIES设置为True,则记录查询。出于性能原因不需要时,应禁用此功能。


只是调用str(query)并不能准确显示发送到数据库的内容,因为最终呈现取决于较低级别的数据库驱动程序。 SQLAlchemy只有参数化字符串和非转义参数。有关原因的详细说明,请参阅the SQLAlchemy docs。通常它足够好,但是要知道这不是最终的查询是很好的。


7
投票

我找到了答案。我只是调用str然后获取sql。

>>> str(User.query.filter_by(role_id=user_role))
'SELECT users.id AS users_id, users.username AS users_username, users.role_id AS
 users_role_id \nFROM users \nWHERE users.role_id = :role_id_1'

3
投票

要为所有查询打印生成的SQL,请设置配置SQLALCHEMY_ECHO=True

app.config['SQLALCHEMY_ECHO'] = True

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

© www.soinside.com 2019 - 2024. All rights reserved.