はじめに
こんにちは、新卒でバックエンドエンジニアをしていますなかじです!
アドベントカレンダー17日目の記事です!
Go言語でデータベース操作を行う際に、主に使用されるツールには「クエリビルダー」と「ORM」があります。
自分自身、実際の違いを理解していなかったので、まとめてみようと思います!
この記事では、GoにおけるクエリビルダーとORMの違いについて、実例を使って解説している記事です!
クエリビルダーとORMの違い
クエリビルダー
SQLのクエリ文を生成するために用意された一連のメソッド。
クエリビルダーは、データベースに対するSQLクエリをコードで簡単に構築できるライブラリです。
goqu
の一例ですが、with句やサブクエリなどの複雑化したクエリなど、ある程度スマートにかけますよね!
sql, _, _ = goqu.From("derived").
With("intermed", goqu.From("test").Select(goqu.Star()).Where(goqu.C("x").Gte(5))).
With("derived", goqu.From("intermed").Select(goqu.Star()).Where(goqu.C("x").Lt(10))).
Select(goqu.Star()).
ToSQL()
fmt.Println(sql)
// 出力結果(見やすさのため改行)
WITH intermed AS (
SELECT * FROM "test"
WHERE ("x" >= 5)
),
derived AS (
SELECT * FROM "intermed"
WHERE ("x" < 10)
) SELECT * FROM "derived"
ORM
ORMは、「Object-Relational Mapping」の略で、Goのオブジェクトとリレーショナルデータベースの対応関係を自動でマッピングすることができます!
なので、DBのスキーマを見て、自動でGoのオブジェクト型を生成してくれるものがあったり、クエリビルダーの機能以外にも機能があります!
SELECTなどのRead処理するときに、その結果を格納するために必要なGoのオブジェクト型を自動生成してくれるのは、すごくありがたいですよね!
gormを例に挙げると、クエリビルダー以外にも多くの機能がありそうですね!
- Full-Featured ORM
- Associations (Has One, Has Many, Belongs To, Many To Many, Polymorphism, Single-table inheritance)
- Hooks (Before/After Create/Save/Update/Delete/Find)
- Eager loading with Preload, Joins
- Transactions, Nested Transactions, Save Point, RollbackTo to Saved Point
- Context, Prepared Statement Mode, DryRun Mode
- Batch Insert, FindInBatches, Find To Map
- SQL Builder, Upsert, Locking, Optimizer/Index/Comment Hints, NamedArg, Search/Update/Create with SQL Expr
- Composite Primary Key
- Auto Migrations
- Logger
- Extendable, flexible plugin API: Database Resolver (Multiple Databases, Read/Write Splitting) / Prometheus…
- Every feature comes with tests
- Developer Friendly
ORMの機能にSQLクエリを組み立てるクエリビルダーの機能があり、内包されているイメージですね!
※ライブラリごとで、得意不得意あると思います!
goのクエリビルダー
調べると、Goで使用されるクエリビルダーのライブラリには以下があります。
-
goqu
https://github.com/doug-martin/goqu -
Squirrel
https://github.com/Masterminds/squirrel -
sqlf
https://github.com/leporo/sqlf
goのORM
調べると、Goで使用されるORMライブラリには以下があります。
-
gorm
https://github.com/go-gorm/gorm -
beego
https://github.com/beego/beego -
sqlx
https://github.com/jmoiron/sqlx
HRBrain内の現状のORMの採用状況を紹介(2024/12/17)
フューチャーさんのブログの項目を参考にして、HRBrain内の現状のORMの採用状況について、調べてみました!
現在、HRBrainでは以下ライブラリを使っています!
-
gorm
https://github.com/go-gorm/gorm -
sqlc
https://github.com/sqlc-dev/sqlc -
sqlx
https://github.com/jmoiron/sqlx -
sqlboiler
https://github.com/volatiletech/sqlboiler -
goqu
https://github.com/doug-martin/goqu
それぞれのチーム状況に応じた技術選定だと思うので、それぞれの良さがあり、あまり不満を聞いたことはないです!🙆
まとめ
浅い記事になってしまいましたが、クエリビルダーとORMの違いをざっと調べてみました!
それぞれのライブラリに特徴があって、すごくおもしろいなと感じました!
また、次回の記事でお会いしましょう!👋
参考
PR
株式会社HRBrainでは、一緒に働く仲間を募集しています!
興味を持っていただけた方はぜひ弊社の採用ページをご確認ください!