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


関連記事

laravel logo

Laravelのバリデーションtips

1 はじめに2 配列のバリデーションでRule::uniqueを使う時のカラム名を指定したい3 配列バリデーションのエラーメッセージ制御4 カスタムバリデーションで、他の属性名を参照したい5 番外:複 ...

【Ruby Advent Calender 2017】Rubyでスクレイピングをしてみる【11日目】

1 はじめに1.1 概要2 仕様3 ソースコード4 使用したモジュール、Gem5 対象ページを取得6 XPATHから目的のものを抜き出す7 次のページのリンクを取得する8 他のサイトの記事でも試してみ ...

Go言語

Go言語の基礎〜Go 1.11 開発環境構築とパッケージバージョン管理〜

1 はじめに2 Go言語(Golang)とは2.1 シンプルな構文2.2 コンパイル言語2.3 並行処理2.4 その他の特徴3 Go開発環境の構築3.1 Goのインストール3.1.1 1. homeb ...

laravel logo

Laravelで画像アップロード実装が楽になるかもしれないlaravel-imageup

1 はじめに2 環境3 導入4 実装5 個人的にハマったこと5.1 配列はダメ5.2 PHPStanで引っかかる6 さいごに7 おすすめ書籍 はじめに こんにちは。webアプリケーションを作る際にファ ...

Go言語

Go 1.24で追加されたjsonのomitzero

1 はじめに2 1.24の更新点3 jsonのomitzeroタグ3.1 Go 1.23までの場合3.2 Go 1.24での場合3.3 要素が空の場合とnilの場合3.4 omitzeroをコントロー ...

フォロー

blog-page_side_responsive

2024年1月
 123456
78910111213
14151617181920
21222324252627
28293031  

アプリ情報

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