开发中用ORM写数据操作确实省事,一行代码就能完成增删改查。但有时候发现查询结果不对,或者性能特别差,这时候光看代码根本看不出问题。毕竟你写的是Python、Java或者C#,数据库执行的可是SQL。想搞清楚到底哪里出了问题,最直接的办法就是把ORM实际生成的SQL捞出来看看。
\h3>以Django为例\nDjango的QuerySet是惰性的,拼的时候不执行,真正取数据才发SQL。要看到它生成的语句,最简单的办法是在QuerySet后面加.query:
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里加上日志配置:
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\nSQLAlchemy也有类似手段
\n如果你用的是Python里的SQLAlchemy,可以在创建引擎时打开echo=True:
from sqlalchemy import create_engine\n\ne = create_engine('sqlite:///test.db', echo=True)\n这样所有通过这个引擎发出的SQL都会被打印出来,连带执行时间和参数一起显示,对排查慢查询特别有用。
\n\nSpring Boot项目怎么看JPA生成的SQL
\nJava那边常用JPA+Hibernate,想看生成的SQL,在application.yml里加上:
spring:\n jpa:\n show-sql: true\n properties:\n hibernate:\n format_sql: true\n重启服务后,控制台就会输出漂亮格式化的SQL语句。如果还想知道具体参数怎么绑定的,再加一条日志配置:
\nlogging:\n level:\n org.hibernate.type.descriptor.sql.BasicBinder: TRACE\n这样一来,每个问号占位符替换成什么值,都清清楚楚。
\n\n别忘了生产环境要关掉
\n这些方法在开发调试时非常好用,但千万别带到线上。打印SQL会增加日志量,暴露表结构和业务逻辑,还有可能拖慢响应速度。上线前记得把相关配置关掉,尤其是echo和show-sql这种全局开关。
小技巧:临时拦截单次请求
\n有时候只需要看某个接口的SQL。比如一个用户列表页加载特别慢,可以在对应视图前后临时启用SQL捕获。Django可以用connection.queries:
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调试"}