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 1.18で追加されるGenericsの紹介

1 はじめに2 GoのGenerics2.1 Genericsの主な仕様2.2 Genericsの制限3 Genericsを使ってみる3.1 基本形3.2 呼び出しの際の型引数を省略する3.3 型制約 ...

crypto

公開鍵暗号の概要、用語と使用例

1 はじめに1.1 前提条件2 暗号化と復号2.1 暗号化とは2.2 復号とは3 暗号化方式3.1 共通鍵暗号3.2 公開鍵暗号4 署名と検証4.1 署名とは4.2 検証とは5 RSA暗号とは5.1 ...

Vue.js入門その4〜TODOアプリにサーバーサイドを追加してみる〜

1 はじめに2 準備2.1 今回作成したいもの2.2 環境構築3 サーバーサイド3.1 DB3.2 メモ:rails generateで余分なファイルを生成しない3.3 作成したファイル4 ビューの作 ...

WebアプリからLINEのメッセージを送る方法

1 はじめに2 Messaging APIとは2.1 Messaging APIの仕組み2.2 Webhookイベント2.3 メッセージオブジェクトの種類2.4 料金形態3 LINE Develope ...

Stripe Connectでダイレクト支払い導入編

1 はじめに2 事前準備3 StripeConnectの導入3.1 stripeパッケージの導入3.2 envの実装4 店舗アカウントの登録4.1 Stripe Connectの設定4.2 Oauth ...

フォロー

blog-page_side_responsive

2024年1月
 123456
78910111213
14151617181920
21222324252627
28293031  

アプリ情報

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