GORMとは
Go言語向けのORM(Object Relational Mapping)ライブラリのひとつ.
データベース操作(SQL)をGoの構造体を使って簡単に扱えるようにするツール.
ORMとは
Object Relational Mappingの略で,
SQL文を書く必要があるのをGoの関数と構造体だけでDBを扱えたりする.
つまり,SQLを直接書かずにデータベース操作ができる仕組み.
GORMにできることの具体例
- SELECT:db.Find(&users)
- WHERE 条件検索:db.Where("name = ?", "Bob").First(&user)
- INSERT:db.Create(&user)
- UPDATE:db.Model(&user).Update("Age", 20)
- DELETE:db.Delete(&user)
- 自動マイグレーション:db.AutoMigrate(&User{})
- SQL実行エラーの取得:result.Error
&userにおいて&を使う理由は,
GROMを使うメリット
- SQLをほぼ書かなくてもよい:Goの構造体で操作
- 型安全:コンパイル時に型ミスを検出できる
- メンテしやすい:ロジックがGo内に統一される
- DB移行が楽:PostgreSQLやMySQLなどの切り替えが簡単
- マイグレーション機能:テーブル作成や更新を自動化できる
実際のコード例
構造体
type User struct {
ID uint
Name string
Email string
}
取得例
var users []User
db.Find(&users)
保存例
db.Create(&User{Name: "Taro", Email: "taro@example.com"})
使い方
setupRouterの引数の型指定でGORMが管理するデータベースへ接続ができる.
これをRepositoryに渡すことで,
Controller → Service → Repository → GORM → DB
という流れでDB操作を行う.
GORMの型名の説明
gorm.DBのDBとは何か
これはデータベース接続とデータベース操作に必要な機能全てを保持した構造体のこと.
DBはGORMが提供するデータベース操作用インスタンスを表す型名.
この中には
- DB接続情報:DSN/host/port/user/password
- コネクションプール:同時接続数の管理
- SQL実行機能:Find,Create,Where,Delete等
- エラー情報:result.Error
- Logger:SQLログ
などのようなものがあり,これらはGORMの内部のコードを見るとこのようにstructとして定義されている.
type DB struct {
Config *Config
Statement *Statement
RowsAffected int64
Error error
...
}
gormとともによく用いるgin.Engineとは何か
Webサーバー本体(リクエストの受付・ルーティング・ミドルウェア管理などを統括する中心部)
Engineは「エンジン=動力の中心」という意味で,Gin Webフレームワークにおけるアプリケーション本体を指す.
gin.Engineが持っている機能として以下のものがある.
- HTTPリクエスト受付:ServeHTTP()
- ルーティング設定:GET,POST,PUT,DELETE
- ルートツリー構造:パスとハンドラの対応表
- ミドルウェア管理:Use()
- JSON出力機能:c.JSON()
内部構造の一部は以下のようになっている.
type Engine struct {
RouterGroup
trees methodTrees
maxParams uint16
...
}
これら二つの扱い方
以上の二つは,ポインタ型で扱うべきである.理由として
- *gorm.DB:DB接続は一つだけ共有したい・コピーすると混乱と負荷
- *gin.Engine;Webサーバー本体を全体で共有したい・コピー不可能