TIGの辻です。GoのORマッパー連載8日目です。本記事では sqlc
を紹介します。早速ですが、結論から行きましょう。
sqlc
まとめ
- SQLファイルからデータベースにアクセスできる型安全なGoのコードを生成するライブラリ
- 構造体のモデルの手書き実装不要
- 複数テーブルをJOINしたときのマッパー実装不要
- 生成されるコードは不要なリフレクションなし
SQLをがんがん書きたい、でも面倒なマッパー構造体は書きたくない、という開発者にとっては大きな味方になります。
sqlc
の紹介
sqlc
はSQLファイルからGoのアプリケーションコードを生成するライブラリです。2020/2に v1.0.0
をリリースし、着々とスターを伸ばしています。2021/08現在は v1.8.0
をリリースしています。本資料で生成しているコードも v1.8.0
を用いています。
https://star-history.t9t.io/#kyleconroy/sqlc
2021/08現在ではMySQLとPostgreSQLの2つのデータベースをサポートしています。
データベースのパーサを適用してクエリを解析している点が設計上の大きな特徴です。解析エンジンがPostgreSQLの場合、実際のPostgreSQLサーバーのソースを cgo
を経由して、Goから呼び出せるようになっています。PostgreSQLのクエリ解析エンジン本体は pganalyze/pg_query_go
が提供しています。
ひとたび以下のようなSQLを実装すれば、sqlc generate
コマンドを実行することで、型安全なGoのアプリケーションコードが生成できます。SQLファイルは複数に分割することもできます。ユースケースごとにSQLファイルを分ける、といった使い方ができるでしょう。
-- name: GetAuthor :one |
※データベースのスキーマ例
本記事ではデータベースはPostgreSQLとします。
create table author |
sqlc
の作者が書いている記事 Introducing sqlc - Compile SQL queries to type-safe Go の中にある How to use sqlc in 3 steps
という謳い文句に嘘はないです。とてもシンプル。
- SQLのクエリを書く
sqlc
コマンドを実行して、クエリに対する型安全性の高いインタフェースを提供するGoのコードを生成するsqlc
で生成したメソッドを呼び出すアプリケーションコードを書く
実際に上のSQLファイルに対して sqlc generate
コマンドを実行すると以下のようなGoのコードが生成されます。
生成されたSQLファイル
- db.go
- models.go
- query.sql.go
// Code generated by sqlc. DO NOT EDIT. |
// Code generated by sqlc. DO NOT EDIT. |
// Code generated by sqlc. DO NOT EDIT. |
上記では db
パッケージとして生成されました。パッケージ名は sqlc
の設定ファイルで調整できます。
アプリケーション実装例
sqlc
が生成したコードを使うアプリケーションの実装例は以下のような感じです。
package main |
個人的に特に嬉しいポイント
- クエリベースでコード生成可能
データベースに対して発行するSQLのSELECT文は、経験上、複数のテーブルをJOINすることが多く、また、複雑になりがちです。またデータベースクライアントでデータベースに接続し、実際にクエリを発行し、実行計画を確認しながらクエリの性能をチェックすることが多いです。
SQLを書いてしまうことが多く、記述したSQLをもとに型安全なGoのアプリケーションコードを生成できるのはかなり嬉しいポイントです。
- 自作のマッパー構造体不要
また、他のO/Rマッパを使った場合、モデルのコードがテーブルベースであることが多く、生のSQLをO/Rマッパに実装したとしても、結果を取得するマッパーのモデルはクエリ個別に作ることが必要になることもあります。こうしたSELECT文におけるマッパーが不要な点も sqlc
を使う嬉しいポイントと言えます。
- O/Rマッパライブラリ不要
生成されたコードを用いることで直接クエリの結果を取得できます。すなわち、database/sql
パッケージを直接用いることでO/Rマッパライブラリは不要となります。