You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:39:02