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


関連記事

Go言語

mutexを使ってGoで排他処理をする

1 はじめに1.1 mutexとは2 mutexを使った排他制御2.1 失敗するケース2.2 mutexを使って排他制御した場合2.3 構造体へmutexを埋め込む3 RWMutexを使う4 さいごに ...

Stripe Connectで支払方法をクローンする

1 はじめに2 プラットフォームの顧客側の実装2.1 プラットフォームの顧客登録2.2 支払方法の登録3 支払方法クローンの実装3.1 顧客と支払方法のクローン3.1.1 支払方法のクローン3.1.2 ...

rails

Ruby、Railsの時間に関するメソッドを使用してみた

はじめに 普段PHPのお仕事をしています、tonnyです。 半年程前からRuby on Railsの勉強を始めました。 今回はよく使う時間に関するメソッドついてまとめたいと思います。 目次 1 はじめ ...

laravel logo

Laravelの基礎知識

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

Laravelのchunkメソッドとcursorメソッドのメモリ使用量

1 はじめに2 テスト用のデータ準備3 get()4 chunk()5 chunkById()6 cursor()7 さいごに8 おすすめ書籍 はじめに テーブルの全レコードに一括で処理を行うバッチを ...

フォロー

blog-page_side_responsive

2024年4月
 123456
78910111213
14151617181920
21222324252627
282930  

アプリ情報

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