实用科技屋
霓虹主题四 · 更硬核的阅读氛围

如何查看ORM生成的SQL语句

发布时间:2025-12-16 21:51:41 阅读:317 次
{"title":"如何查看ORM生成SQL语句","content":"

开发中用ORM写数据操作确实省事,一行代码就能完成增删改查。但有时候发现查询结果不对,或者性能特别差,这时候光看代码根本看不出问题。毕竟你写的是Python、Java或者C#,数据库执行的可是SQL。想搞清楚到底哪里出了问题,最直接的办法就是把ORM实际生成的SQL捞出来看看。

\h3>以Django为例\n

Django的QuerySet是惰性的,拼的时候不执行,真正取数据才发SQL。要看到它生成的语句,最简单的办法是在QuerySet后面加.query

\n
from myapp.models import User\n\nqs = User.objects.filter(name__contains='张').exclude(age__lt=18)\nprint(qs.query)
\n

这行打印出来的就是最终交给MySQL或PostgreSQL执行的SQL字符串,包括WHERE条件、JOIN和参数占位符,一目了然。

\n\n

使用日志配置监听所有SQL

\n

如果不想每次手动打印,可以开启Django的SQL日志。在settings.py里加上日志配置:

\n
LOGGING = {\n    'version': 1,\n    'disable_existing_loggers': False,\n    'handlers': {\n        'console': {\n            'class': 'logging.StreamHandler',\n        },\n    },\n    'loggers': {\n        'django.db.backends': {\n            'handlers': ['console'],\n            'level': 'DEBUG',\n        },\n    }\n}
\n

只要项目运行时有数据库操作,终端就会实时输出每一条SQL,适合调试阶段全程监控。

\n\n

SQLAlchemy也有类似手段

\n

如果你用的是Python里的SQLAlchemy,可以在创建引擎时打开echo=True

\n
from sqlalchemy import create_engine\n\ne = create_engine('sqlite:///test.db', echo=True)
\n

这样所有通过这个引擎发出的SQL都会被打印出来,连带执行时间和参数一起显示,对排查慢查询特别有用。

\n\n

Spring Boot项目怎么看JPA生成的SQL

\n

Java那边常用JPA+Hibernate,想看生成的SQL,在application.yml里加上:

\n
spring:\n  jpa:\n    show-sql: true\n    properties:\n      hibernate:\n        format_sql: true
\n

重启服务后,控制台就会输出漂亮格式化的SQL语句。如果还想知道具体参数怎么绑定的,再加一条日志配置:

\n
logging:\n  level:\n    org.hibernate.type.descriptor.sql.BasicBinder: TRACE
\n

这样一来,每个问号占位符替换成什么值,都清清楚楚。

\n\n

别忘了生产环境要关掉

\n

这些方法在开发调试时非常好用,但千万别带到线上。打印SQL会增加日志量,暴露表结构和业务逻辑,还有可能拖慢响应速度。上线前记得把相关配置关掉,尤其是echoshow-sql这种全局开关。

\n\n

小技巧:临时拦截单次请求

\n

有时候只需要看某个接口的SQL。比如一个用户列表页加载特别慢,可以在对应视图前后临时启用SQL捕获。Django可以用connection.queries

\n
from django.db import connection\n\n# 执行某些ORM操作之后\nprint(connection.queries)
\n

数组里每条记录包含SQL语句和执行时间,方便定位瓶颈操作。

","seo_title":"查看ORM生成的SQL语句方法汇总","seo_description":"在开发中如何查看Django、SQLAlchemy、Spring Boot等框架ORM生成的实际SQL语句,帮助调试查询问题与性能优化。","keywords":"查看ORM生成的SQL, Django查看SQL, SQLAlchemy echo, Spring Boot JPA 显示SQL, ORM调试"}