5
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

クラベスAdvent Calendar 2024

Day 11

【お手軽】Kotlin+Exposedで実行したクエリをログ出力する!

Posted at

はじめに

O/RマッパーのExposedを使用したKotlinでの開発を行なっています。
Exposedではクエリっぽく実装することはできても、
実際にどのようなクエリが実行されているかはそのままでは確認できません。

そこで今回は、実行されたクエリをログとして出力するよう実装してみました。
かなりお手軽に実装できたので紹介します!

実行したクエリをログ出力する

実装方法はaddLogger(StdOutSqlLogger)をコーディングするだけ!

import org.jetbrains.exposed.sql.StdOutSqlLogger
import org.jetbrains.exposed.sql.addLogger

    fun dropTable() {
        transaction {
            addLogger(StdOutSqlLogger)
            SchemaUtils.drop(SalaryTreasurerTable)
        }
    }

ルールとしては、transaction内でaddLogger(StdOutSqlLogger)を実行する必要があります。

出力結果としては以下のとおりです。

出力結果
SQL: DROP TABLE IF EXISTS hoge_table

(ちゃんとIF EXISTSしてくれてたんだ。トゥンク)

検証

お手軽すぎて記事が薄くなってしまったので、追加で検証します。

検証1:addLogger(StdOutSqlLogger)の手前でクエリを実行するとどうなるのか

    fun dropTable() {
        transaction {
            SchemaUtils.drop(SalaryTreasurerTable)
            addLogger(StdOutSqlLogger)
        }
    }

結果:ログは出力されませんでした。
これは予想通りですね。
あくまでaddLogger(StdOutSqlLogger)した直後からクエリがログ出力されるようです。

検証2:ログ出力をトランザクション内で無効化できるか

トランザクション内でログ出力の有無を切り替えたい場合はremoveLoggerを使用すれば、うまく行くようです。

    fun dropTable() {
        transaction {
            val logger = addLogger(StdOutSqlLogger)
            println("処理1")
            dropTable()
            logger.removeLogger(StdOutSqlLogger)
            println("処理2")
            dropTable()
            logger.addLogger(StdOutSqlLogger)
            println("処理3")
            dropTable()
        }
    }
出力結果
処理1
SQL: DROP TABLE IF EXISTS salary_treasurer_table
処理2
処理3
SQL: DROP TABLE IF EXISTS salary_treasurer_table

個人的にはBulkInsertなどはログ出力を回避したいので、こちらで対応することになりそうです。

5
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?