Help us understand the problem. What is going on with this article?

GORMでINSERT時に構造体の特定のフィールドを無視する方法

概要

GolangのORマッパーとしてGORMがあります。
GORMを利用するときは、構造体を引数に渡してDBから値を取得します。
構造体は基本的にテーブルのカラムにあわせて定義すると思いますが、JOINなどをしたときには、構造体にフィールドを追加することがあります。
しかし、フィールドを追加したがために、INSERTのときにそんなカラムはないよ!!となったりします。
そういうとき、特定のフィールドを無視して欲しいですよね!という解決策を書いていきます。

今回の元の構造体

entities/user.go
package entities

type User struct {
  ID   uint   `gorm:"primary_key"`
  Name string `gorm:"not null"`
}
entities/user.go
package entities

type Article struct {
  ID       uint   `gorm:"primary_key"`
  UserID   string `gorm:"not null"`
  Title    string `gorm:"not null"`
  Content  string `gorm:"not null"`
}

課題

今回、「Userに紐づく記事の数を取得したい。」というものがあった。
具体的には、Userの構造体に記事の数のフィールド(ArticleAmountフィールド)を追加して、データを取得したい。
そこで以下のように追加すると、DBからSELECTは取得できるが、UserデータをGORMでINSERTするときに、そんなカラムはないよ...!!と言われてしまう。

※新たに構造体を定義すればよいじゃん!といえばその通りだが、そのために新たな構造体を作るのもなんだかなぁという気持ちになっている。

entities/user.go
package entities

type User struct {
  ID            uint   `gorm:"primary_key"`
  Name          string `gorm:"not null"`
  ArticleAmount string
}

では、どうしよう...?

解決策

案外簡単で、`gorm:"-"`を追加するだけで良い。
ドキュメントにはこちらに示してある。

entities/user.go
package entities

type User struct {
  ID            uint   `gorm:"primary_key"`
  Name          string `gorm:"not null"`
  ArticleAmount string `gorm:"-"`
}
Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away