我想获取Flask-SQLAlchemy查询发出的SQL。在Django中,我可以打印query
属性来获取SQL。我怎样才能在Flask中获得类似的东西?
# django
>>> queryset = MyModel.objects.all()
>>> print queryset.query
SELECT "myapp_mymodel"."id", ... FROM "myapp_mymodel"
答案 0 :(得分: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。通常它足够好,但要知道它不是最终的查询是很好的。
答案 1 :(得分: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'
答案 2 :(得分:3)
要为所有查询打印生成的SQL,请设置配置SQLALCHEMY_ECHO=True
。
app.config['SQLALCHEMY_ECHO'] = True