Go
PostgreSQL
GORM

GolangのGORMで単数形のテーブルを扱う

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
}

DB.SingularTableの実装へのリンク


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オブジェクトには影響を与えません。

DB.Tableの実装へのリンク


参照実装

上記を踏まえて GORM を利用したサンプルコードを公開しているので参考にしてください。

https://github.com/cobot00/gorm-practice/blob/master/main.go