在 Go 專案使用 GORM 操作資料庫

連線

建立連線:

1
2
3
4
5
6
dsn := "root:root@tcp(127.0.0.1:3306)/table?charset=utf8mb4&parseTime=true"
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})

if err != nil {
log.Fatal(err.Error())
}
  • 為了正確處理 time.Time,需要帶上 parseTime=true 參數。
  • 為了支援完整的 UTF-8 編碼,需要帶上 charset=utf8mb4 參數。

模型

範例

以下是一個模型的範例:

1
2
3
4
5
6
7
8
9
10
11
type User struct {
ID uint
Name string
Email *string
Age uint8
Birthday *time.Time
MemberNumber sql.NullString
ActivedAt sql.NullTime
CreatedAt time.Time
UpdatedAt time.Time
}
  • 使用指標做為型別,預設值會是 null,適合用在結構體屬性。

巢狀結構體

使用巢狀結構體定義模型:

1
2
3
4
type User struct {
gorm.Model
Name string
}

使用 gorm.Model 會帶入以下屬性:

1
2
3
4
5
6
type Model struct {
ID uint `gorm:"primaryKey"`
CreatedAt time.Time
UpdatedAt time.Time
DeletedAt gorm.DeletedAt `gorm:"index"`
}

JSON

定義 JSON 標籤:

  • 使用 json:"-" 隱藏屬性。
  • 使用 json:"column" 重新定義屬性名稱。
  • 使用 json:",omitempty" 隱藏空值屬性。
1
2
3
4
5
6
7
8
type User struct {
gorm.Model
Name string `gorm:"size:255;not null;"`
Email string `gorm:"size:255;not null;uniqueIndex;"`
Password string `gorm:"size:255;not null;" json:"-"`
Property *Property `gorm:"polymorphic:Owner;polymorphicValue:user;" json:",omitempty"`
Entries []Entry `gorm:"polymorphic:Owner;polymorphicValue:user;" json:",omitempty"`
}

遷移

使用 AutoMigrate() 方法遷移資料表。

1
2
3
err := db.AutoMigrate(
&model.User{},
)

使用 MigratorDropTable() 方法丟棄資料表。

1
2
3
err := db.Migrator().DropTable(
&model.User{},
)

參考資料