フューチャー技術ブログ

GoのORマッパー連載を始めます

はじめに

TIG DXユニット真野です。7/26(月)~8/3(水)の平日にかけて、GoでRDBに対してアクセスライブラリ(ORMとクエリビルダー)をテーマにした連載を始めます。

フューチャー技術ブログではAWS DynamoDBの記事がなぜか多いですが、会社としてはデータストア層にRDB(PostgreSQL、MySQL、Oracle)を採用するのが主流です。

GoのDBアクセスライブラリは過去記事でもいくつか取り上げられており、技術選定およびプロダクション利用レベルのナレッジは貯まりつつあります。

それとは別に触ってみたことなはないものの(GORM v2は実際に触っているかもしれませんが)、メンバーそれぞれでrel、ent、goquなど気になるライブラリがいくつか持っていることもわかってきました。せっかくの機会です。これをテーマに連載する運びになりました。

スケジュール

(2021.09.18追記)おまけとして、筒井さんがさらに寄稿してくれました。

ORMとクエリビルダー

ORMは Object Relational Mapperの略で、通常はGoの構造体とRDBのレコードを紐付ける処理のことを指します。O/Rマッパーと呼ぶことが多いですが、略してORMとも呼びます。名前から見るとSQL検索結果を構造体にマッピングすること(Goだとsqlx相当の処理)かなと思いますが、実際はSQLを組み立てるDSLを提供するライブラリが多いです。

クエリビルダーは、広い意味のORM機能のうち、SQLクエリを組み立てるライブラリのことです。調べると goquとかがまさにそれにあたります。

細かくはgoquを連載テーマにした伊藤真彦さんに譲るとして、簡単ではありますがここでサンプルコードも出しちゃいます。

ds := goqu.Insert("user").
Cols("first_name", "last_name").
Vals(
goqu.Vals{"Greg", "Farley"},
goqu.Vals{"Jimmy", "Stewart"},
goqu.Vals{"Jeff", "Jeffers"},
)
insertSQL, args, _ := ds.ToSQL()
fmt.Println(insertSQL, args)

上記のDSLを実行すると次のSQLが生成されるという形式です。

INSERT INTO "user" ("first_name", "last_name") VALUES ('Greg', 'Farley'), ('Jimmy', 'Stewart'), ('Jeff', 'Jeffers') []

実際にRDBアクセスするためには、database/sql パッケージかそのラッパーのライブラリで生成されたSQLを実行して動かすと言った形式です。

生SQLを書かずgoquのDSLに乗っかるメリットですが、コンパイル時にエラーに気がつけるなど、ある一定の品質を保てることがメリットだと思います。ORM一つとってもそれぞれのライブラリがどの領域の何を解決しようとしているかに着目すると楽しいですよね。

フューチャー内の現状の採用状況

ちゃんと調べたわけではないですが、なんとなく社内の観測範囲では、GORM派とSQLBoiler派が多い気がします。

他には、smallnest/gen とか xo/xo をどっぷり使っているチームもあります。フューチャーは伝統的にスキーマ駆動開発を好む文化がある(と思っている)ので良く分かります。

どれを採用しても、良かった(ライブラリはよくできている)という声しか聞かないので、たまにPull Requestを出したよとかは聞きましたが、どれも良いツールなんだと思います。

さいごに

2021年初に立てた計画に沿って様々な連載を開催しています。この連載は当初は2020年のGoCDK連載の続きとして考えていましたが、GoCDKだと人数分ネタが厳しそうということで急遽方向転換しました。

急なピボットでしたが、結果的にはより興味が引く(業務に役立ちやすい)テーマになったのではないでしょうか。

私自身も寄稿しますが、他の人の記事が楽しみです。

連載についてフィードバックがあれば、お気軽にTwitterアカウントまでフィードバックしていただければです。