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のブラウザテスト「Dusk」で非同期で重たい処理のテストを実装してみよう

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

laravel logo

Laravelでメールを送る

1 はじめに1.1 準備2 実装2.1 Mailableクラスの作成2.2 テンプレートの作成2.3 Mailableクラスの修正2.4 コントローラの作成2.5 コンフィグの修正3 さいごに4 おす ...

rails

RailsでERBからJavaScriptにhashを渡す方法

1 はじめに2 カスタムデータ属性とは3 実装例3.1 コントローラの実装3.2 ビューの実装3.3 実行結果4 さいごに はじめに 以前、選択したプルダウンメニューに応じて別のプルダウンメニューの内 ...

laravel logo

Laravelの基礎知識

1 はじめに2 Laravelの概要2.1 学習コストが低い2.2 Symfonyがベース2.3 DIを積極的に活用している3 ディレクトリ構成3.1 app3.2 bootstrap3.3 conf ...

laravel logo

Laravelでテストコードを書くには? Featureテスト/Unitテスト

1 はじめに2 FeatureとUnitの使い分け3 テスト用データベースの準備4 Featureテスト4.1 テスト対象のコード4.2 テストコードの実装4.3 テスト結果の検証4.3.1 ステータ ...

フォロー

blog-page_side_responsive

2024年1月
 123456
78910111213
14151617181920
21222324252627
28293031  

アプリ情報

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