如何检索KotlinExposed Library for MySQL生成的实际SQL查询?

wlp8pajw  于 2023-06-04  发布在  Mysql
关注(0)|答案(1)|浏览(143)

有没有一种方法可以让我们知道由KotlinExposed Library形成的实际sql查询,即在数据库上执行的get。我们也可以通过分析器在数据库上执行查询,但我更感兴趣的是Exposed Library是否提供了一种方法来做到这一点。
对于用代码形成的复杂查询,我希望得到实际的sql查询

6ojccjat

6ojccjat1#

假设您在transaction{}块中的表上运行查询,您可以将Logger添加到事务块。transaction{}有一个名为addLogger()的扩展函数,它接受SqlLogger。您可以添加StdOutSqlLogger,它是公开库附带的默认SqlLogger。这里有一个例子;

fun getAllItemsFromDb(): List<Items> {
    return transaction {
        addLogger(StdOutSqlLogger) // Adds a logger that logs SQL statements
        Items
            .selectAll().let {
                fromResultRowToItems(it)
            }

    }
}

无论何时调用getAllItemsFromDb(),记录器都会将生成的SQL记录到控制台
您还可以通过实现SqlLogger接口并覆盖log函数,对记录SQL日志进行更细粒度的控制;

object MyQueryLogger : SqlLogger {
    override
    fun log(context: StatementContext, transaction: Transaction) {
        //Customize how you want your logging, for example, using SLF4j
        val logger = LoggerFactory.getLogger(javaClass)
        logger.info("SQL: ${context.expandArgs(transaction)}")
        logger.trace("SQL: ${context.expandArgs(transaction)}")
    }
}

然后在您的事务{}中添加您的自定义Logger

fun getAllItemsFromDb(): List<Items> {
        return transaction {
            addLogger(MyQueryLogger ) // Add your custom logger
            Items
                .selectAll().let {
                    fromResultRowToItems(it)
                }
    
    
        }
    }

相关问题