显示 Flask-SQLAlchemy 生成的 SQL

Show the SQL generated by Flask-SQLAlchemy

我想获取 Flask 发出的 SQL-SQLAlchemy 查询。在 Django 中,我可以打印 query 属性以获得 SQL。我怎样才能在 Flask 中得到类似的东西?

# django
>>> queryset = MyModel.objects.all()
>>> print queryset.query
SELECT "myapp_mymodel"."id", ... FROM "myapp_mymodel"

我找到答案了。我只是调用 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'

Flask-SQLAlchemy 记录请求期间所有查询的调试信息。您可以使用 get_debug_queries(). Flask-Debugtoolbar 获取信息,例如,使用它来提供一个调试面板,其中包含每个页面呈现的查询时间信息。

get_debug_queries() returns 按执行顺序排列的查询列表。

>>> 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。通常它已经足够好了,但最好知道这不是最终查询。

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

app.config['SQLALCHEMY_ECHO'] = True

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