はじめに
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などはログ出力を回避したいので、こちらで対応することになりそうです。