django查看执行的sql查询语句

本文介绍如何在Django中优化复杂查询并查看底层执行的SQL语句,通过一个具体示例展示了如何使用filter方法结合Q对象排除特定条件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

对于一些比较复杂的查询在做优化时,通常需要查看下django底层执行的sql语句。

例如:

data = Tasks.objects.select_related().filter(~Q(pk=4) & (~Q(reviewer__contains='pengpai(彭湃)') | ~Q(handler__contains='pengpai(彭湃)') | ~Q(director__contains='pengpai(彭湃)')))

可以通过这种方法:

data = Tasks.objects.select_related().filter(~Q(pk=4) & (~Q(reviewer__contains='pengpai(彭湃)') | ~Q(handler__contains='pengpai(彭湃)') | ~Q(director__contains='pengpai(彭湃)'))).query.__str__()

结果如下

'SELECT `db_tasks`.`id`, `db_tasks`.`create_at`, `db_tasks`.`publisher`, `db_tasks`.`service_type`, `db_tasks`.`task_type`, `db_tasks`.`period`, `db_tasks`.`title`, `db_tasks`.`body`, `db_tasks`.`director`, `db_tasks`.`reviewer`, `db_tasks`.`handler`, `db_tasks`.`critical`, `db_tasks`.`finish_time`, `db_tasks`.`status`, `db_tasks`.`send_range`, `db_tasks`.`person_id`, `db_person`.`id`, `db_person`.`create_at`, `db_person`.`username`, `db_person`.`city`, `db_person`.`department`, `db_person`.`permission`, `db_person`.`group_id` FROM `db_tasks` INNER JOIN `db_person` ON (`db_tasks`.`person_id` = `db_person`.`id`) WHERE (NOT (`db_tasks`.`id` = 4) AND (NOT (`db_tasks`.`reviewer` LIKE BINARY %pengpai(彭湃)%) OR NOT (`db_tasks`.`handler` LIKE BINARY %pengpai(彭湃)%) OR NOT (`db_tasks`.`director` LIKE BINARY %pengpai(彭湃)%))) ORDER BY `db_tasks`.`create_at` DESC'

### 查看Django中实际执行SQL语句 在开发过程中,有时需要查看Django ORM 执行的实际SQL查询来调试或优化应用程序。有几种方法可以实现这一点。 #### 使用`django.db.connection` 通过访问 `django.db.connection.queries` 可以获取到当前数据库连接所执行过的所有SQL查询记录。为了启用这个功能,在设置文件中的DEBUG模式应该被开启[^1]: ```python import logging from django.conf import settings from django.db import connection if settings.DEBUG: logger = logging.getLogger('django.db.backends') logger.setLevel(logging.DEBUG) def show_sql(): for query in connection.queries: print(query['sql']) ``` 这段代码会在每次请求结束时打印出所有的SQL查询语句。需要注意的是,这种方法仅适用于单次HTTP请求周期内的查询日志收集;对于长时间运行的任务或其他情况可能不适合。 #### 利用中间件捕获SQL查询 创建自定义中间件可以帮助更灵活地控制何时以及如何显示这些查询信息。下面是一个简单的例子: ```python class QueryDebuggerMiddleware(object): def __init__(self, get_response): self.get_response = get_response def __call__(self, request): response = self.get_response(request) if not settings.DEBUG or 'text/html' not in response['Content-Type']: return response queries = '\n'.join([q['sql'] for q in connection.queries]) content = f"<html><body>{response.content.decode()}</body></html>" footer = "<div style='position:fixed;bottom:0;left:0;width:100%;background:white;'>" footer += "Queries:<br/>" + queries.replace('\n', '<br/>\n') + "</div>" modified_content = content[:-7] + footer + content[-6:] response.content = modified_content.encode() return response ``` 此中间件将在HTML页面底部附加一个包含所有已执行SQL查询的小部件。这有助于快速了解哪些查询是在渲染特定视图期间发生的。 #### 设置日志级别 另一种方式是调整项目的日志配置,使得当发生任何数据库操作时都会自动记录下相应的SQL语句。可以在settings.py里添加如下配置项[^2]: ```python LOGGING = { ... 'loggers': { 'django.db.backends': { 'level': 'DEBUG', 'handlers': ['console'], }, } } ``` 这样做的好处是可以持续监控整个应用生命周期内产生的所有查询活动而无需修改业务逻辑代码本身。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值