sqlcの未使用クエリを削除するコマンドを作った話
このブログは GMOペパボ エンジニア Advent Calendar 2024 🎄 の22日目の記事です。
21日目はTsuyoshi Mikamiさんの「go-milterの話」でした。
MTA(Mail Transfer Agent)に対してメールフィルタリングの機能を提供するmilterをGoで実装できるパッケージの紹介でした!
メールに対して色々処理ができ、スパム検知など色々できそうですね!
sqlcって何?
sqlcはSQLファイルからGoの型安全なコードを生成するライブラリです。 SQLクエリをGoのコードに変換することで、型安全性を保ちながらデータベース操作を行うことができます。詳しく知りたい方は公式のドキュメントをご覧ください。
どうして作ったの?
現在、私が働いているチームで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