Orator ORM如何查看/记录执行的SQL查询并打印生成语句?
在Orator ORM中查看/记录执行SQL及打印查询语句的方法
我之前也碰到过这个问题——直接打印Orator的Builder对象只会得到类似<orator.orm.builder.Builder object at 0x7f3ee22738d0>的输出,完全看不到实际要执行的SQL。不过别担心,有几个简单的方案可以解决你的需求:
一、开启全局查询日志,记录所有执行的SQL
如果你想追踪整个程序运行过程中所有执行的数据库查询,可以通过Orator的DatabaseManager开启查询日志:
from orator import DatabaseManager # 你的数据库配置 db_config = { 'mysql': { 'driver': 'mysql', 'host': 'localhost', 'database': 'your_database', 'user': 'your_user', 'password': 'your_password', 'prefix': '' } } db = DatabaseManager(db_config) # 开启查询日志 db.enable_query_log() # 执行你的数据库操作 students = db.table('students').where('age', '>', 18).get() # 获取并打印所有查询记录 query_logs = db.get_query_log() for log in query_logs: print(f"执行的SQL: {log['query']}") print(f"绑定的参数: {log['bindings']}\n")
这个方法会记录所有通过该DatabaseManager执行的查询,每条日志包含SQL语句和对应的绑定参数,方便你排查问题。
二、直接打印单个查询对象的SQL语句
如果你只需要查看某个Builder对象对应的SQL,直接调用to_sql()方法就可以了,同时可以用get_bindings()获取绑定的参数:
# 构造查询 student_query = db.table('students').where('grade', '=', 10).order_by('name') # 打印带占位符的SQL语句 print("带占位符的SQL:", student_query.to_sql()) # 输出示例: SELECT * FROM `students` WHERE `grade` = %s ORDER BY `name` ASC # 打印绑定的参数 print("绑定参数:", student_query.get_bindings()) # 输出示例: [10]
如果你想得到可以直接在数据库客户端执行的完整SQL(替换掉占位符),可以自己简单处理一下:
def get_raw_sql(query): sql = query.to_sql() bindings = query.get_bindings() # 根据你的数据库类型处理占位符,MySQL用%s,PostgreSQL可能用$1/$2等 for binding in bindings: # 字符串类型添加引号,数字类型直接转换 if isinstance(binding, str): processed_binding = f"'{binding}'" else: processed_binding = str(binding) sql = sql.replace('%s', processed_binding, 1) return sql # 使用方法 print("完整可执行SQL:", get_raw_sql(student_query)) # 输出示例: SELECT * FROM `students` WHERE `grade` = '10' ORDER BY `name` ASC
三、针对Model类的查询同样适用
如果你用的是Orator的Model模型类(比如自定义的Student模型),上述方法完全通用:
from orator import Model class Student(Model): __table__ = 'students' # 构造Model查询 model_query = Student.where('age', '<', 20).limit(5) # 打印SQL和参数 print(model_query.to_sql()) print(model_query.get_bindings())
需要注意的是,直接打印Builder对象看不到SQL,是因为它的默认__repr__方法没有返回SQL内容,必须主动调用to_sql()方法才行,之前遍历对象属性找不到是正常的——这是一个方法而非属性。
内容的提问来源于stack exchange,提问作者Deepak Terse
相关产品推荐
相关产品推荐

