如何打印或记录Django中实际执行的SQL语句?求实现方法
嘿,我来帮你解决这个ORM SQL语句记录的问题!想要像Django那样随时查看或记录实际执行的SQL,其实大部分主流ORM都有现成的方法,可能你没挖到对应的文档细节,下面分几种情况给你讲清楚:
一、单次调试:直接从查询对象提取SQL
如果只是临时调试某条查询,直接从ORM的查询实例里获取生成好的SQL是最快的:
- SQLAlchemy:对于构建好的Query对象,你可以直接转成字符串看基础SQL,或者用
compile()方法生成带实际参数的完整SQL(和Django的query属性效果一致):
from sqlalchemy import select from your_models import User # 构建查询 query = select(User.id, User.phone).where(User.name == '123') # 方式1:打印基础SQL(不带参数) print(str(query)) # 方式2:生成带实际参数的完整SQL compiled_sql = query.statement.compile( bind=your_db_engine, compile_kwargs={"literal_binds": True} ) print(compiled_sql)
literal_binds=True会把参数直接替换到SQL语句里,调试时看特别直观。
- Peewee:用
sql()方法就能拿到SQL字符串和参数元组,再手动拼接也很方便:
from your_models import User query = User.select(User.id, User.phone).where(User.name == '123') sql_str, params = query.sql() print(f"SQL: {sql_str},参数: {params}") # 调试用:替换参数得到最终SQL final_sql = sql_str % params print(f"最终执行SQL: {final_sql}")
二、全局记录:开启ORM的日志功能
如果想自动记录所有执行的SQL(包括insert、update、delete这些写操作),开启ORM的日志是最省心的方案:
- SQLAlchemy:配置Python的logging模块,把
sqlalchemy.engine的日志级别设为INFO或DEBUG,就能自动输出所有执行的SQL细节:
import logging # 基础日志配置 logging.basicConfig(level=logging.INFO) # 开启SQLAlchemy的SQL日志 logging.getLogger('sqlalchemy.engine').setLevel(logging.INFO)
这样每次数据库操作,控制台或日志文件里都会出现完整的SQL语句和参数。
- Peewee:直接修改自带的logger级别即可:
import logging from peewee import logger logger.setLevel(logging.DEBUG)
如果需要把日志写到文件,自己加个FileHandler就行。
三、自定义ORM/封装查询:自己加日志逻辑
如果你是自己封装的数据库操作,那可以在执行SQL的核心函数里加一层日志记录:
def execute_db(sql, params=None): params = params or () # 记录原始SQL和参数(生产环境推荐这个,避免SQL注入风险) print(f"[DB] 执行SQL: {sql},参数: {params}") # 调试用:生成带参数的最终SQL(仅用于本地调试,生产别用!) debug_sql = sql % params print(f"[DB Debug] 最终SQL: {debug_sql}") # 实际执行数据库操作 with your_db_connection.cursor() as cursor: cursor.execute(sql, params) return cursor.fetchall()
这里要注意:直接替换参数生成SQL只适合调试,生产环境绝对不能这么做,防止SQL注入风险,只记录原始SQL和参数就够了。
如果你用的是其他特定ORM没提到,比如Tortoise-ORM之类的,可以告诉我具体库,我再给你针对性的方法!
内容的提问来源于stack exchange,提问作者张豪飞
相关产品推荐
相关产品推荐

