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

如何获取Kotlin Exposed Library为MySQL生成的实际SQL查询语句?

获取Kotlin Exposed生成的实际SQL查询语句

当然可以,Exposed本身提供了多种方式获取生成的SQL,不用依赖数据库探查器,针对复杂查询也完全适用:

  • 直接提取未执行的查询SQL
    如果你只是想查看构建好的查询对应的SQL文本,不需要实际执行数据库操作,可以调用prepareSQL()方法。示例:

    val userQuery = Users.select { Users.id eq 1 }
    val generatedSql = userQuery.prepareSQL(TransactionManager.current())
    println(generatedSql) // 打印生成的SELECT语句
    

    不管是多表Join、子查询还是自定义条件的复杂查询,这个方法都能输出Exposed最终要发送给数据库的SQL内容。

  • 启用内置日志输出
    Exposed支持通过日志框架输出所有执行的SQL语句及参数,只需要调整日志级别。以SLF4J+Logback为例,在logback.xml中添加:

    <logger name="org.jetbrains.exposed.sql" level="DEBUG"/>
    <logger name="org.jetbrains.exposed.sql.statements" level="DEBUG"/>
    

    配置后,所有执行的SQL(包括绑定的参数值)都会被打印到日志中,能直观看到复杂查询的完整执行细节。

  • 自定义SQL监听器
    如果需要对SQL做自定义处理(比如记录到特定系统、做性能分析),可以实现StatementInterceptor接口来拦截SQL执行过程:

    class CustomSQLListener : StatementInterceptor {
        override fun beforeExecution(statement: Statement) {
            val sql = statement.prepareSQL(TransactionManager.current())
            val params = statement.args.joinToString(prefix = "[", postfix = "]") { it.toString() }
            println("即将执行SQL: $sql")
            println("参数: $params")
        }
    }
    
    // 注册监听器(建议在应用初始化时执行)
    TransactionManager.addListener(CustomSQLListener())
    

    这种方式可以在SQL执行前后捕获完整语句和参数,完全适配复杂查询的调试或记录需求。

内容的提问来源于stack exchange,提问作者Lakhan SINGH

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 01:02:47