BackEnd

Goのクエリビルダー goqu を使ってみる

投稿日:

はじめに

最近携わっているとある案件では、CRUD操作はsqlcで生成したORMを使い、QueryServiceではgoquを使ってクエリを組み立てています。

以前の記事ではsqlcについて紹介しましたので、今回はgoquについて紹介したいと思います。

goquとは

まず初めに、goquについて簡単に紹介します。

goquは複数のDBに対応した多機能のクエリビルダーです。

goquで提供されている様々なExpressionsなどを利用して、複雑なクエリを楽に楽しく記述することができます。

また、クエリを組み立てるだけでなく、直接クエリを実行することもできます。

更に、複数のレコードをスキャンして、構造体やプリミティブにマッピングすることもできます。ただし、goquはORMとして使用されることを想定してるわけではないので、アソシエーションやフックといった機能は提供していません。

対応するDB

投稿時点では、goquは以下のDBのクエリ生成に対応しています。

  • MySQL
  • PostgreSQL
  • SQLite3
  • SQL Server

また、これら以外の書式であっても、Custom Dialectsを定義することで対応することができます。

基本的な使い方

各クエリ操作を行う際にはまず、特定のDBの書式にあったクエリを出力するために、Dialect関数を使用してDiralectWrapperを生成します。

注意点としては、使用したいDBに対応するパッケージをインポートしておく必要があります。

ちなみに、Dialectを使わないでクエリを生成する方法もありますが、便宜上、本記事では全てDialectを使ってクエリを生成します。

Insert句を生成する

Insert句を生成するには、生成したDialectの Insert() メソッドに Cols() メソッドと Vals() メソッドをチェインする形で行います。

または、 Rows() メソッドをチェインする書き方もできます。

すでに構造体が定義されている場合は、それを使うこともできます。

Select句を生成する

Select句を生成するには、 Select() メソッドと必要に応じて Where() メソッドなどをチェインして行います。

COUNTやMAXなどの関数も使えます。

すでに構造体が定義されている場合は、それを使うこともできます。

Update句を生成する

Update句を生成するには、 Update() メソッドと Set() メソッドなどをチェインして行います。

すでに構造体が定義されている場合は、それを使うこともできます。

Delete句を生成する

Delete句を生成するには、 Delete() メソッドをチェインして行います。

より実践的な使い方

goquでの基本的なCRUD操作の紹介が終わったところで、次はより実践的な機能を紹介します。

Expressionsを使ってクエリを組み立てる

Expressionsは、Where、From、Selectなどの部分のより詳細にな記述をサポートします。すべては紹介しきれないので、よく使われそうなものをピックアップして紹介します。

Ex{}

Ex{} はWhere句で最も使われるであろう型で、columnとvalueを等号演算子で比較する際にまとめて記述するために使われます。

ExOr{}

ExOr{}Ex{} と似ていますが、各条件がAndではなくOrで判定されます。

C()

C() はcolumnを表す識別子で、 Where() などと一緒に使われます。

V()

V() はクエリで直接値を使いたい場合に使われます。

And()

And()Where() の中で複数の条件を定義する際に使われます。

Or()

Or()And() と同様に Where() の中で使われます。

Prepared Statementsを使う

デフォルトでは、goquはすべてのパラメータを直接クエリに埋め込みますが、パラメータを分けたい場合は、 Prepared() を使うことでこれを実現します。

Scanした結果を構造体に反映する

ScanStructs() を使うことで、Select句で指定したcolumnを構造体に反映することができます。

注意点としては、事前に sql.Open() でコネクションを張っておき、それをDiralectWrapperの DB() メソッドで渡しておく必要があります。

さいごに

ここでは主にgoquの基本的な使い方を紹介しましたが、まだまだたくさんの便利な機能がありますので、goqu良さそうだなと思っていただけた方は、ぜひドキュメントをご覧ください。

おすすめ書籍

Go言語 100Tips ありがちなミスを把握し、実装を最適化する impress top gearシリーズ 初めてのGo言語 ―他言語プログラマーのためのイディオマティックGo実践ガイド Go言語による分散サービス ―信頼性、拡張性、保守性の高いシステムの構築

blog-page_footer_336




blog-page_footer_336




-BackEnd
-

執筆者:

免責事項

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


comment

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

CAPTCHA


関連記事

laravel logo

Laravelのバッチ処理を作る

1 はじめに2 環境3 artisanコマンド作成4 artisanコマンドをバッチとして登録する5 さいごに6 おすすめ書籍 はじめに こんにちは。webアプリにつきもののバッチ処理ですが、もちろん ...

Go言語

Go 1.18で追加されるGenericsの紹介

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

laravel logo

LaravelのArtisanコマンドを自作する

1 はじめに2 コマンドの作成方法3 コマンドの実装3.1 文字列出力3.2 引数3.3 オプション3.4 入力を使用した対話型3.4.1 ask()メソッド3.4.2 secret()メソッド3.4 ...

Go言語

Go 1.18のGenericsを使った地味に便利な関数を紹介

1 はじめに2 関数の紹介2.1 解決したいこと2.2 関数の内容3 さいごに4 おすすめ書籍 はじめに 3月15日にリリースされたGo 1.18で、ついにGenericsがサポートされました(Goの ...

php logo

PHPでGmail APIを利用してメールデータを取得してみる

1 はじめに2 Gmail API の有効化3 OAuthクライアントの作成4 Google Clientライブラリのインストール5 OAuth認証6 メールデータの取得7 さいごに8 おすすめ書籍 ...

フォロー

blog-page_side_responsive

2024年4月
 123456
78910111213
14151617181920
21222324252627
282930  

アプリ情報

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