🧹

sqlcの未使用クエリを削除するコマンドを作った話

2024/12/23に公開

このブログは GMOペパボ エンジニア Advent Calendar 2024 🎄 の22日目の記事です。

21日目はTsuyoshi Mikamiさんの「go-milterの話」でした。
https://rsym1290.hatenablog.jp/entry/2024/12/21/092052
MTA(Mail Transfer Agent)に対してメールフィルタリングの機能を提供するmilterをGoで実装できるパッケージの紹介でした!
メールに対して色々処理ができ、スパム検知など色々できそうですね!

https://github.com/harakeishi/sqlc-tidy

sqlcって何?

sqlcはSQLファイルからGoの型安全なコードを生成するライブラリです。
https://github.com/sqlc-dev/sqlc
SQLクエリをGoのコードに変換することで、型安全性を保ちながらデータベース操作を行うことができます。詳しく知りたい方は公式のドキュメントをご覧ください。
https://docs.sqlc.dev/en/latest/

どうして作ったの?

現在、私が働いているチームでsqlcを使用して開発を行っていますが、使わなくなったクエリを消さずに新しいものに置き換えたり、そもそも使用していた処理自体がなくなったりと、様々な理由で生成元のSQLファイルに使用されていないクエリが残存してしまう状況でした。そのため、生成元のSQLファイルが肥大化し、残存してしまったクエリを消したい衝動に駆られたため、このツールを作成しました。

インストール方法

インストールは以下のコマンドで行えます。簡単にインストールできるので、ぜひ試してみてください。

go install github.com/harakeishi/sqlc-tidy@latest

使用方法

sqlcの設定ファイル(sqlc.ymlなど)があるディレクトリでsqlc-tidyと入力すると実行されます。以下はtestデータで実行した際の結果です。実行結果を確認することで、どのクエリが削除されたかを簡単に把握できます。

$ sqlc-tidy
==delete==
file: query.sql
query: ListAuthors
==delete==
file: query.sql
query: CreateAuthor
==delete==
file: query.sql
query: DeleteAuthor

できること・できないこと

できること

  • 自動生成元のクエリを抽出し、コード内で使用されているかチェックし、使用されていなければ生成元のクエリを削除

できないこと

  • 自動生成されたファイル内にある使用されていないコードの削除
    • これは生成元のクエリから未使用クエリを削除後に自動生成すればおおよそ消されるので、今回の責務外としています

直したいところ

  • 未使用クエリを生成元ファイルから削除した際、生成元ファイルが空になった場合、ファイルごと削除したい
  • テストの整備が十分ではないので追加したい
  • コード内で使用されているかはASTを使用してチェックしていますが、sqlの方は文字列のパターンマッチングなので、精度を上げるためにもsql parserに置き換えたい

終わりに

このツールは突貫制作なので、まだまだ改善できる部分があります。皆様からのフィードバックやcontributeをお待ちしています。ぜひ一緒にこのツールをより良いものにしていきましょう!

Discussion