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


関連記事

rails

関連するモデルのレコードを一緒に作成する方法

1 はじめに1.1 前提条件2 実装2.1 モデルの作成2.2 コントローラの作成2.3 Viewの作成3 さいごに はじめに フォームからレコードを作成する際に、関連するモデルのレコードを一緒に作成 ...

rails

【Puma】アプリサーバのチューニング

1 はじめに2 チューニングで注意する項目3 子プロセスの数3.1 最低3つの子プロセスを割り当てる3.2 最大子プロセス数3.3 CPUコア数と子プロセス数3.4 なぜPumaの子プロセス数を増やす ...

rails

configに追記したのに、rails runnerが起動しない?

1 はじめに1.1 環境2 rails runnerを使用してみる2.1 バッチファイルの作成2.2 configにパスを追記2.3 実行3 ところが…3.1 解決方法4 おまけ(runnerコマンド ...

js

TypeScriptでJavaScriptのライブラリを使用するには?

1 はじめに2 対応方法2.1 npmで@typesからインストールする2.2 自分で型定義ファイルを作る3 Declaration Space3.1 Type Declaration Space3. ...

Go言語

Go 1.16でのgo getとgo installの変更点

1 はじめに2 go getとgo installの役割2.1 go getの役割2.2 go installの役割3 この変更で何が改善されたのか3.1 go:generateと併用する4 その他の ...

フォロー

blog-page_side_responsive

2024年4月
 123456
78910111213
14151617181920
21222324252627
282930  

アプリ情報

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