BackEnd

sqlcを使ってSQLファイルからGoのコードを生成する

投稿日:

はじめに

Goでデータベースにアクセスする場合、様々なやり方(ORMを使う、クエリを直接書いて実行する等)がありますが、それぞれ良さと辛みがあると思います。

個人的には、RailsのActiveRecordのようなORMはあまり好きではなく、SQLを書いて実行する事が多かったのですが、それはそれで構造体へのマッピングが面倒といった課題もありました。

今回は、そんな面倒なマッピングなどをいい感じにやってくれるsqlcというライブラリについて、紹介したいと思います。

sqlcとは

sqlcは、SQLファイルからGoの型安全なコードを生成するライブラリです。

SQLからGoのファイルを生成するライブラリはいくつかありますが、それらは、構造体タグを使ったり、手作業によるマッピングが必要だったりしますが、sqlcではこれらの作業が必要ありません。

sqlcの使い方は非常に簡単で、

  1. なんらかの処理をするSQLを書く
  2. sqlc generate コマンドを実行して、Goのコードを生成する
  3. 生成されたコードを使ってデータベースにアクセスする

たったこれだけです。

コード解析

sqlcでは、コードの生成中に全てクエリとDDLを解析し、テーブル内の全ての列とクエリ内の全ての式の名前と型を把握します。これにより、これらのいずれかが一致しない場合はコードの生成に失敗するので、クエリの実行時までエラーがわからないような状態を防ぐ床ができます。

サポートする言語とデータベース

公式によると、sqlcでは以下の言語とデータベースをサポートしています。

言語 Plugin MySQL PostgreSQL SQLite
Go (built-in) Stable Stable Stable
Kotlin sqlc-gen-kotlin Beta Beta Not implemented
Python sqlc-gen-python Beta Beta Not implemented

また、コミュニティにより、F#に対応したプラグインもあるようです。

sqlcでコードを生成する

それでは、実際にsqlcを使ってデータベースにアクセスするコードを生成してみます。

準備

まず初めに、sqlcでコードを生成するための準備として、sqlcのインストールし、設定ファイルを作成します。

インストールの方法はいくつかあるので、詳しくは公式のInstalling sqlcをご覧ください。

設定ファイルは sqlc.yaml という名前でproject rootに置いておきます。

これらのプロパティの内容は以下のとおりです。

engine データベースの種類
queries クエリファイルのパス
schema DDLファイルのパス
package 生成するコードのパッケージ名
path 生成するコードの出力先

DDLを書く

スキーマ定義を schema.sql に書きます。

クエリを書く

それぞれのCRUD処理のクエリを query.sql に書きます。

sqlcでコードを生成するために、各クエリに名前とコマンドを示すコメントを付ける必要があります。

-- name: DeleteBook :exec

これらのannotationについては、詳しくはこちらをご覧ください。

コードを生成する

sqlc generate コマンドを実行してGoのコードを生成します。

このコマンドを実行すると以下の様にファイルが生成が生成されます。

生成されたコードの中身は以下のようになっています。

db.go

models.go

query.sql.go

生成されたコードを使う

生成されたコードを使って、データベースにauthorとbookのCRUD処理を書いてみます。

このように、非常に簡単かつ楽にデータベースにアクセスする処理を書くことができます。

sqlcでの構造体の生成をカスタマイズ

sqlcでコードを生成する際に、生成される型をカスタマイズする方法を紹介します。

手順は以下のとおりです。

  1. (任意)置き換える際に使用する型を定義する
  2. (任意) schema.sql を修正する
  3. sqlc.yaml を修正する(overridesを追記する)
  4. sqlc generate で生成する

例として、booksにJSON型のカラムを追加し、それを別途定義したBookData型を使って構造体が生成されるようにします。

置き換えに使用する型の定義

dtoディレクトリを作成し、book_data.goを作成します。ファイルの内容は以下のとおりです。

schema.sqlを修正する

booksテーブルにjson型のdataカラムを追加します。

sqlc.yamlを修正する

overridesを追加して、books.dataがBookDataとして構造体が生成されるように設定します。

sqlc generateで生成する

最後に sqlc generate コマンドでコードを生成すると、 models.go が以下のように生成されます。

Book.Data の型が dto.BookData型 になっています。

さいごに

sqlcを使うと、データベースにアクセスするコードを簡単かつ楽に書くことができ、コードを書くのが楽しくなるのではと思います。

今回紹介した内容以外にも、その他の設定ファイルの項目についてや、便利なマクロなどもありますので、これらを活用してsqlcをもっと便利に使うことができます。

おすすめ書籍

Go言語 100Tips ありがちなミスを把握し、実装を最適化する impress top gearシリーズ 実用 Go言語 ―システム開発の現場で知っておきたいアドバイス エキスパートたちのGo言語 一流のコードから応用力を学ぶ Software Design plus

blog-page_footer_336




blog-page_footer_336




-BackEnd
-

執筆者:

免責事項

このブログは、記事上部に記載のある投稿日時点の一般的な情報を提供するものであり、投資等の勧誘・法的・税務上の助言を提供するものではありません。仮想通貨の投資・損益計算は複雑であり、個々の取引状況や法律の変更によって異なる可能性があります。ブログに記載された情報は参考程度のものであり、特定の状況に基づいた行動の決定には専門家の助言を求めることをお勧めします。当ブログの情報に基づいた行動に関連して生じた損失やリスクについて、筆者は責任を負いかねます。最新の法律や税務情報を確認し、必要に応じて専門家に相談することをお勧めします。


comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA


関連記事

Rust入門してみた その5 ライフタイム

1 はじめに2 ライフタイムと借用チェッカー3 コンパイラにライフタイムを教える3.1 ライフタイムの指定が不要なケース4 ライフタイムの省略5 さいごに6 おすすめ書籍 はじめに Rustには、借用 ...

Go言語

Goのfmt.print系関数のまとめ

1 はじめに2 print関数の命名規則3 各print関数の説明3.1 Print(標準出力へ出力)系関数3.2 Sprint(文字列を出力)系関数3.3 Fprint(ファイルへ出力)系関数4 書 ...

laravel logo

Laravelのブラウザテスト「Dusk」で非同期で重たい処理のテストを実装してみよう

1 はじめに2 JavaScriptの式で待機する2.1 テスト対象となるコード2.2 Duskのテストコード3 DOM要素の表示を待つ3.1 テスト対象となるコード3.2 Duskテストコードの実装 ...

rails

Shrineでアップロードする際に画像を加工する

1 はじめに2 アップロードする画像のリサイズ2.1 Gemを追加2.2 Uploaderの修正3 サムネイルを作成する3.1 Uploaderの修正3.2 サムネイルを表示する4 バリデーションの追 ...

laravel logo

Laravelの開発環境構築

1 はじめに2 開発環境構築2.1 Homestead2.2 Laradock3 Laradockで開発環境構築3.1 Laradockのダウンロード3.2 コンテナの設定ファイルを作成3.3 コンテ ...

フォロー

blog-page_side_responsive

2024年1月
 123456
78910111213
14151617181920
21222324252627
28293031  

アプリ情報

私たちは無料アプリもリリースしています、ぜひご覧ください。 下記のアイコンから無料でダウンロードできます。