規約

IDを主キーとして

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

type User struct {
  ID   string // field named `ID` will be used as a primary field by default
  Name string
}

primaryKeyタグを使用して、他のフィールドを主キーとして設定できます。

// Set field `UUID` as primary field
type Animal struct {
  ID     int64
  UUID   string `gorm:"primaryKey"`
  Name   string
  Age    int64
}

詳しくは複合主キーもご覧ください。

複数形テーブル名

GORMは、構造体の名前をsnake_cases形式のテーブル名に変換します。構造体Userの場合、規約によりテーブル名はusersになります。

TableName

Tablerインターフェースを実装することで、デフォルトのテーブル名を変更できます。例:

type Tabler interface {
TableName() string
}

// TableName overrides the table name used by User to `profiles`
func (User) TableName() string {
  return "profiles"
}

注記 TableNameは動的な名前を許容しません。その結果は将来のためにキャッシュされます。動的な名前を使用するには、Scopesを使用できます。例:

func UserTable(user User) func (tx *gorm.DB) *gorm.DB {
return func (tx *gorm.DB) *gorm.DB {
if user.Admin {
return tx.Table("admin_users")
}

return tx.Table("users")
}
}

db.Scopes(UserTable(user)).Create(&user)

一時的に名前を指定する

Tableメソッドを使用して、一時的にテーブル名を指定します。例:

// Create table `deleted_users` with struct User's fields
db.Table("deleted_users").AutoMigrate(&User{})

// Query data from another table
var deletedUsers []User
db.Table("deleted_users").Find(&deletedUsers)
// SELECT * FROM deleted_users;

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

FROM句でサブクエリを使用する方法については、サブクエリからの取得をご覧ください。

NamingStrategy

GORMでは、デフォルトのNamingStrategyをオーバーライドすることで、デフォルトの命名規則を変更できます。これは、TableNameColumnNameJoinTableNameRelationshipFKNameCheckerNameIndexNameを構築するために使用されます。GORM設定で詳細を確認してください。

列名

列のデータベース名は、規約によりフィールド名のsnake_caseを使用します。

type User struct {
  ID        uint      // column name is `id`
  Name      string    // column name is `name`
  Birthday  time.Time // column name is `birthday`
  CreatedAt time.Time // column name is `created_at`
}

columnタグで列名をオーバーライドするか、NamingStrategyを使用できます。

type Animal struct {
  AnimalID int64     `gorm:"column:beast_id"`         // set name to `beast_id`
  Birthday time.Time `gorm:"column:day_of_the_beast"` // set name to `day_of_the_beast`
  Age      int64     `gorm:"column:age_of_the_beast"` // set name to `age_of_the_beast`
}

タイムスタンプトラッキング

CreatedAt

CreatedAtフィールドを持つモデルの場合、その値がゼロの場合、レコードが最初に作成されたときにフィールドは現在時刻に設定されます。

db.Create(&user) // set `CreatedAt` to current time

user2 := User{Name: "jinzhu", CreatedAt: time.Now()}
db.Create(&user2) // user2's `CreatedAt` won't be changed

// To change its value, you could use `Update`
db.Model(&user).Update("CreatedAt", time.Now())

autoCreateTimeタグをfalseに設定することで、タイムスタンプトラッキングを無効にできます。例:

type User struct {
CreatedAt time.Time `gorm:"autoCreateTime:false"`
}

UpdatedAt

UpdatedAtフィールドを持つモデルの場合、その値がゼロの場合、レコードが更新または作成されたときにフィールドは現在時刻に設定されます。

db.Save(&user) // set `UpdatedAt` to current time

db.Model(&user).Update("name", "jinzhu") // will set `UpdatedAt` to current time

db.Model(&user).UpdateColumn("name", "jinzhu") // `UpdatedAt` won't be changed

user2 := User{Name: "jinzhu", UpdatedAt: time.Now()}
db.Create(&user2) // user2's `UpdatedAt` won't be changed when creating

user3 := User{Name: "jinzhu", UpdatedAt: time.Now()}
db.Save(&user3) // user3's `UpdatedAt` will change to current time when updating

autoUpdateTimeタグをfalseに設定することで、タイムスタンプトラッキングを無効にできます。例:

type User struct {
UpdatedAt time.Time `gorm:"autoUpdateTime:false"`
}

注記 GORMは複数のタイムトラッキングフィールドをサポートし、UNIX(ナノ/ミリ)秒でトラッキングします。モデルで詳細を確認してください。

プラチナスポンサー

ゴールドスポンサー

プラチナスポンサー

ゴールドスポンサー