慣例

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

資料表名稱

你可以透過實作 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 子句中使用子查詢

命名策略

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(奈秒/毫秒)秒數追蹤,請查看 模型 以取得更多詳細資訊

白金贊助商

金牌贊助商

白金贊助商

金牌贊助商