規則

gorm.Model

gorm.ModelID, CreatedAt, UpdatedAt, DeletedAtというフィールドを持つ、GoのStructです。

It may be embedded into your model or you may build your own model without it.

// gorm.Modelの定義
type Model struct {
ID uint `gorm:"primary_key"`
CreatedAt time.Time
UpdatedAt time.Time
DeletedAt *time.Time
}

// `ID`, `CreatedAt`, `UpdatedAt`, `DeletedAt`フィールドを`User`モデルに注入します
type User struct {
gorm.Model
Name string
}

// gorm.Model無しにモデルを宣言します
type User struct {
ID int
Name string
}

主キーとしてのID

GORMはデフォルトではIDという名前のフィールドをテーブルの主キーとして扱います。

type User struct {
ID string // `ID`という名前のフィールドはデフォルトで主キーとして扱われます
Name string
}

// `AnimalID`フィールドを主キーに設定します
type Animal struct {
AnimalID int64 `gorm:"primary_key"`
Name string
Age int64
}

複数形のテーブル名

テーブル名は、Struct名の複数形が使われます。

type User struct {} // デフォルトのテーブル名は `users`です

// Userのテーブル名を`profiles`にする
func (User) TableName() string {
return "profiles"
}

func (u User) TableName() string {
if u.Role == "admin" {
return "admin_users"
} else {
return "users"
}
}

// テーブル名を複数形にしない。trueにすると、`User`のテーブル名は `user`になります
db.SingularTable(true)

テーブル名の指定

// User構造体の定義を使って`deleted_users`テーブルを作成します
db.Table("deleted_users").CreateTable(&User{})

var deleted_users []User
db.Table("deleted_users").Find(&deleted_users)
//// SELECT * FROM deleted_users;

db.Table("deleted_users").Where("name = ?", "jinzhu").Delete()
//// DELETE FROM deleted_users WHERE name = 'jinzhu';

デフォルトのテーブル名の変更

DefaultTableNameHandlerを定義すると、デフォルトのテーブル名の生成ルールを変更できます。

gorm.DefaultTableNameHandler = func (db *gorm.DB, defaultTableName string) string  {
return "prefix_" + defaultTableName;
}

スネークケースのカラム名

カラム名はスネークケース化されたフィールド名になります。

type User struct {
ID uint // カラム名は `id`
Name string // カラム名は `name`
Birthday time.Time // カラム名は `birthday`
CreatedAt time.Time // カラム名は `created_at`
}

// Overriding Column Name
type Animal struct {
AnimalId int64 `gorm:"column:beast_id"` // カラム名を `beast_id` に設定する
Birthday time.Time `gorm:"column:day_of_the_beast"` // カラム名を `day_of_the_beast` に設定する
Age int64 `gorm:"column:age_of_the_beast"` // カラム名を `age_of_the_beast` に設定する
}

タイムスタンプの追跡

CreatedAt

CreatedAtフィールドの持つモデルでは、レコードの初回生成時に現在時刻が設定されます。

db.Create(&user) // `CreatedAt`には現在時刻が設定されます

// 値を変更するには`Update`を使います
db.Model(&user).Update("CreatedAt", time.Now())

UpdatedAt

UpdatedAtフィールドを持つモデルでは、レコード保存時に現在時刻が設定されます

db.Save(&user) // `UpdatedAt`に現在時刻を設定します

db.Model(&user).Update("name", "jinzhu") // `UpdatedAt`に現在時刻を設定します

DeletedAt

モデルにDeletedAtフィールドが存在する場合、Deleteが呼ばれても実際にはデータベースからデータは削除されません。代わりにDeletedAtDeleteが呼ばれた時の時刻がセットされます。 Refer to Soft Delete