Go ORM/クエリビルダー選定(by Claude)

に公開

TL;DR

Ent が第一候補。
型安全性とスキーマファーストアプローチを重視し、SQL的構文は犠牲にしてもLinux Foundation支援による長期安定性とAIサポートの充実を優先した結果。

背景

SQLBoilerが2024年末にメンテナンスモードに入ってしまったため、新規のGoプロジェクトで採用するORM/クエリービルダーの選定をいくつかの要件を元にClaudeに依頼しました。

要件

  • 型安全性: ランタイムエラーを最小化するため
  • PostgreSQL + pgxドライバー統合: パフォーマンスとPostgreSQL固有機能の活用
  • 効率的なリレーション読み込み: N+1問題と巨大なJOIN結果セットの両方を回避するスマートプリローディング
  • SQL的な構文: 可能な限りSQLに近い記述
  • マイグレーションファイルの自動生成: オプションだが望ましい
  • 長期的な維持可能性: アクティブな開発とコミュニティサポート
  • AIアシスタントサポート: AI支援開発時代において、人気のあるライブラリはAIアシスタントからより良いサポートを受けられる

sqlcは、SQLの動的な組み立てが出来ないため、評価対象には含めていません。

評価対象

GORM (with gen)

メリット:

  • 成熟したエコシステムと豊富なドキュメント
  • Preload()による優れたスマートプリローディング(N+1問題を回避)
  • 大規模コミュニティサポート
  • 自動マイグレーション機能
  • pgx互換性

デメリット:

  • SQL的でない構文(メソッドチェーン)
  • 「魔法的」でデバッグが困難な場合がある
  • スキーマ変更からのマイグレーションファイル自動生成なし
  • リフレクションによるパフォーマンスオーバーヘッド

Ent (Meta/Facebook)

メリット:

  • コード生成による優れた型安全性
  • スキーマファーストアプローチと自動マイグレーション生成
  • グラフ探索による強力なスマートプリローディング(N+1問題を回避)
  • Meta/Facebook起源でLinux Foundation傘下のプロジェクトとして長期的維持可能性と継続的開発が期待できる (Ent Joins the Linux Foundation)
  • 豊富なエンタープライズ機能(マルチテナンシー、プライバシーポリシー)
  • 成長中のコミュニティとドキュメント
  • pgx互換性

デメリット:

  • SQL的でない構文(グラフ指向)
  • 学習コストが高い
  • より独自仕様的なアプローチ
  • 生成されるコードが重い場合がある

Bun

メリット:

  • 適度な型安全性を保ちながら非常にSQL的な構文
  • 優れたPostgreSQL/pgx統合
  • クリーンなマイグレーションシステム
  • フルORMと比較して軽量
  • リレーションによる効率的な読み込み

デメリット:

  • 弱い型安全性(構造体タグ、ランタイム検証)
  • 小さなコミュニティ
  • 手動スキーマ定義
  • ランタイムエラーの可能性が高い

Bob

メリット:

  • データベーススキーマからの生成(SQLBoilerの後継)
  • SQLBoilerより優れた型安全性
  • SQL的な構文
  • ThenLoadによる効率的なスマートプリローディング(N+1問題を回避)
  • pgx互換性

デメリット:

  • 非常に小さなコミュニティ
  • 限定的なエコシステムとドキュメント
  • AIアシスタントサポートが少ない
  • 新しいプロジェクトで長期的な採用が不確実

選定基準分析

基準 GORM Ent Bun Bob
型安全性 ⭐⭐⭐ ⭐⭐⭐⭐⭐ ⭐⭐ ⭐⭐⭐⭐
SQL的構文 ⭐⭐ ⭐⭐ ⭐⭐⭐⭐⭐ ⭐⭐⭐⭐⭐
効率的リレーション読み込み ⭐⭐⭐⭐⭐ ⭐⭐⭐⭐⭐ ⭐⭐⭐⭐ ⭐⭐⭐⭐
pgx統合 ⭐⭐⭐ ⭐⭐⭐⭐ ⭐⭐⭐⭐⭐ ⭐⭐⭐⭐
自動マイグレーション ⭐⭐ ⭐⭐⭐⭐⭐
コミュニティ/人気度 ⭐⭐⭐⭐⭐ ⭐⭐⭐⭐ ⭐⭐⭐ ⭐⭐
長期的維持可能性 ⭐⭐⭐⭐ ⭐⭐⭐⭐⭐ ⭐⭐⭐ ⭐⭐
AIアシスタントサポート ⭐⭐⭐⭐⭐ ⭐⭐⭐⭐ ⭐⭐⭐ ⭐⭐

決定プロセス

  1. 型安全性の優先: SQLBoilerの経験から、ランタイムエラーは重大な懸念事項。これにより、優れたSQL的構文にも関わらずBunは第一選択肢から除外。

  2. コミュニティとAI時代の考慮: 現在のAI支援開発環境において、人気度とコミュニティサポートは開発速度と問題解決能力に大きな影響を与える。

  3. 長期的維持可能性: SQLBoilerのメンテナンスのみステータスを踏まえ、アクティブなメンテナンスと進化が必要。

  4. PostgreSQL重視: すべての選択肢でPostgreSQLは十分サポートされているが、pgx統合の品質に差がある。

最終決定: Ent

選択: Ent 以下の理由による:

  • 型安全性: コード生成によりSQLBoilerに匹敵するコンパイル時安全性を提供
  • 自動マイグレーション: スキーマファーストアプローチと自動生成マイグレーションファイルがオプション要件を完璧に満たす
  • 組織的支援: Meta/Facebook起源でLinux Foundation傘下のプロジェクトとして長期的維持可能性と継続的開発が期待できる (Ent Joins the Linux Foundation)
  • コミュニティ成長: 優れたドキュメントを持つ強力で成長中のコミュニティ
  • AIアシスタントサポート: 小規模な代替手段と比較してAIトレーニングデータでより良くカバーされている
  • PostgreSQL統合: パフォーマンス向上のための良好なpgx互換性

受け入れるトレードオフ:

  • 型安全性と生成コードの利点を優先し、SQL的構文の犠牲を受け入れる
  • 包括的なドキュメントとコミュニティサポートにより学習コストを相殺
  • より独自仕様的なアプローチが一貫性を提供し、ランタイムエラーを防止

参考(OSS Insight: Golang ORM - Ranking)

今回の評価には特に含めていませんがFYI。
https://ossinsight.io/collections/golang-orm/

Discussion