GolangのORMの GORM はRailsのActiveRecord影響を受けているのかテーブル名は複数形であることを要求されます。
モデル名は単数、DBのテーブルは複数形という文化に慣れていないと混乱するし、既存のプロジェクトに GORM
を導入する際の障害になりかねません。
ここでは GORM
で単数形のテーブルを扱うための方法を紹介します。
前提条件
以下の環境で動作を確認しています。
- Go 1.11.1
- GORM 1.9.1
- PostgreSQL 9.6.9
単数形のテーブルを扱うための二つの方法
1. db.SingularTable(true)
db.SingularTable(true)
DBの初期化時などに gorm.DB
に対して上記のコードを実行します。
これは破壊的操作かつ、これ以降でこの db
オブジェクトが発行する全てのDB操作に影響します。
例えば、以下のようなモデルを定義している場合は samples
ではなく sample
テーブルが対象になります。
type Sample {
gorm.Model
}
var sample Sample
db.First(&sample) // sampleテーブルにSELECT文を発行する
モデル名 = テーブル名
という命名ルールで開発を行いたい場合にはこの方法がシンプルでよいかと。
参考情報: SingularTableの実装
// main.go
func (s *DB) SingularTable(enable bool) {
modelStructsMap = sync.Map{}
s.parent.singularTable = enable
}
2. DB操作毎にテーブル名を指定する
単数形のテーブルに対するDB操作毎に db.Table
を呼び出してテーブル名を明示的にセットする方法です。
都度指定する手間がありますが他のDB操作には影響しないので一部のテーブルだけが単数形の名称の場合には有用な方法です。
db.Table
を呼び出す以外は GORM
の操作方法は変わりません。
type Sample {
gorm.Model
}
sample := Sample{}
db.Table("sample").Create(&sample)
var sample Sample
db.Table("practice").Order("id").First(&sample)
参考情報:
// main.go
func (s *DB) Table(name string) *DB {
clone := s.clone()
clone.search.Table(name)
clone.Value = nil
return clone
}
クローンを生成して返しているので元のDBオブジェクトには影響を与えません。
参照実装
上記を踏まえて GORM
を利用したサンプルコードを公開しているので参考にしてください。