0

我正在尝试分析我们的 Django (1.3) Web 应用程序的 SQL 性能。我添加了一个附加到django.db.backends并设置的自定义日志处理程序DEBUG = True,这使我可以查看所有正在执行的数据库查询。

但是 SQL 不是有效的 SQL!实际查询是select * from app_model where name = %s使用传入的一些参数(例如"admin"),但是日志消息没有引用参数,所以 sql 是select * from app_model where name = admin,这是错误的。这也发生在使用django.db.connection.queries. AFAIK django 调试工具栏有一个复杂的自定义光标来处理这个问题。

更新对于那些建议使用 Django 调试工具栏的人:我知道那个工具,它很棒。但是它不能满足我的需要。我想运行我们应用程序的示例交互,并聚合使用的 SQL。DjDT 非常适合展示和浅层学习。但对于汇总和总结数十页的交互作用并不好。

是否有任何简单的方法来获得运行的真实、合法的 SQL?

4

4 回答 4

2

查看django-debug-toolbar。打开一个页面,边栏将显示所有 SQL 查询以及其他信息。

于 2013-01-28T17:02:22.077 回答
0

select * from app_model where name = %s是一个准备好的语句。我建议您分别记录语句和参数。为了获得格式正确的查询,您需要执行类似"select * from app_model where name = %s" % quote_string("user")或更一般的操作query % map(quote_string, params)

请注意,quote_string 是特定于 DB 的,DB 2.0 API 没有定义 quote_string 方法。所以你需要自己写一个。出于记录目的,我建议将查询和参数分开,因为它可以更好地进行分析,因为您可以轻松地对查询进行分组,而无需考虑实际值。

于 2013-01-28T17:18:13.517 回答
0

Django Docs 声明这种不正确的引用只发生在 SQLite 上。

https://docs.djangoproject.com/en/dev/ref/databases/#sqlite-connection-queries

您是否尝试过其他数据库引擎?

于 2013-01-28T17:27:35.590 回答
0

每个 QuerySet 对象都有一个“查询”属性。做你想做的事情的一种方法(我接受可能不是一个理想的方法)是使用Django 的测试客户端将每个视图生成的查找链接到一种脚本化的用户故事中。对于每个查找,您的用户故事包含的只是将查询附加到您在最后编写的类似文件的对象中,例如(为简洁起见,使用列表代替):

l = []
o = Object.objects.all()
l.append(o.query)
于 2013-01-28T17:02:27.163 回答