【Golang】Gormでデバッグを行う

開発
この記事を書いた人
井上 周

WEBのバックエンドエンジニア。金沢大学大学院→株式会社マイベスト。
最も得意な言語はRuby(Rails)。その他、GoやPython、TypeScriptsを使った開発を行っています。

井上 周をフォローする

Gormを使ったアプリケーションの開発を行っていて、デバッグを行いたかった時の備忘録です。

公式サイトを見てもすこしわかりづらかったので調べて使ったことをまとめました。

やりたいこと

今回やりたかったことは、gormを使って実装した処理がうまく作用していなかったため、実際にどのようなSQLが実行されているのかを調べることです。

例えば以下のようなコードがあったとして、このproductモデルの削除がなぜかうまく行かない場合にデバッグする際に今回の方法を使いました。

if err := db.GetDB().Delete(&product).Error; err != nil {
    return fmt.Errorf("の削除に失敗しました: %v", err)
}

単一のクエリを見る

db.GetDB().Delete(&product)

こちらの処理で発生するSQL文を確認したいときにはdb.GetDB()のあとにDebug()をつけて上げるだけでOKです。

db.GetDB().Debug().Delete(&product)

以下のように、Debug()生成されるSQLが出ます。

(/sandbox/sample.go:2)
[2022-07-12 11:32:43]  [1.70ms]  DELETE FROM `products`  WHERE (id = 17821591)
[1 rows affected or returned ]

実行する全てのSQLを表示させる

一方で、毎回全ての箇所にDebug()をつけるのは面倒なので、goのコマンドを実行した際に実行される全てのSQLを見たいときには、gormのdbの初期化の際にオプションを指定します。

db, err = gorm.Open("mysql", command)
db.LogMode(true)

これで全てのログがコンソールから確認できます。

(/app/internal/lib/sample.go:31)
[2022-07-12 11:24:39]  [1.65ms]  SELECT * FROM `products`  WHERE (`id` = 17821591)
[1 rows affected or returned ]

(/app/internal/lib/sample.go:32)
[2022-07-12 11:24:39]  [1.46ms]  SELECT * FROM `products`  WHERE (id = 17821591) ORDER BY `shop`.`price` ASC LIMIT 1
[0 rows affected or returned ]

(/app/internal/lib/sample.go:33)
[2022-07-12 11:24:39]  [1.39ms]  DELETE FROM `products`  WHERE `shop`.`id` = 155649 AND ((`shop`.`id` = 155649))
[1 rows affected or returned ]

(/app/internal/lib/sample.go:34)
[2022-07-12 11:24:39]  [1.43ms]  DELETE FROM `products`  WHERE (id = 17821591)
[1 rows affected or returned ]

これでデバッグがだいぶやりやすくなりました!

参考

Logger
LoggerGormには デフォルトのLogger実装が入っています。デフォルトでは、スロークエリとエラーをロギングします。 デフォルトのLoggerにはいくつかの設定オプションがあり、初期化中にカスタマイズすることができます。例: new...
Golang GORM デバッグモード
今回、GORMのデバッグモードについて 今まで、Debug()を使用していたけど、プロダクトの際に全部外すのってめんどくさいなーって思ったのでドキュメント読んだらありました。 今まで 今までは下記のよ
gormで実行されているクエリ(SQL文)を確認する
下記のように実行しているgormの裏側で実行されているクエリが知りたい場合には… 1db.Where("id = ?", accountID).Find(&account)

コメント

タイトルとURLをコピーしました