LoginSignup
8
4

More than 5 years have passed since last update.

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

Last updated at Posted at 2019-01-20

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 を利用したサンプルコードを公開しているので参考にしてください。

8
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
4