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


関連記事

Go言語

Go言語 gocraft/workを使って常駐プロセスでジョブを処理させる

1 はじめに2 workの特徴3 workを使えるようにする3.1 Redisのインストール3.2 Go用のライブラリインストール4 Enqueue〜ジョブ実行まで4.1 Enqueue側4.2 ジョ ...

Rust入門してみた (基本構文編)

1 はじめに2 Rustとは?3 Rustの特徴的な基本構文3.1 変数と定数3.2 所有権3.3 所有権の借用3.4 関数3.5 エラーハンドリング3.5.1 回復不能なエラー(panic!)3.5 ...

Rust入門してみた その3 Enum / match / Option編

1 はじめに2 Enum2.1 Enumの定義2.2 パターンマッチ2.3 Enumへのメソッド実装3 よく使う標準Enum3.1 Option3.2 Result4 おすすめ書籍 はじめに 前回に引 ...

Go言語

Goの抽象構文木でコードを解析する

1 はじめに1.1 抽象構文木とは2 ASTでコードを解析する2.1 サンプルコードを解析する2.2 構造体の木構造を確認する2.3 メソッドの木構造を確認する3 任意の対象を捜索する4 ASTをファ ...

laravel logo

Laravelでの署名付きURL生成

1 はじめに2 今回のサンプル3 ビュー4 ルーティング5 コントローラー5.1 署名付きURLの生成5.2 期限ありの署名付きURLの生成5.3 署名のチェック6 おまけ6.1 署名の仕組7 さいご ...

フォロー

blog-page_side_responsive

2024年1月
 123456
78910111213
14151617181920
21222324252627
28293031  

アプリ情報

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