- 标签
- index索引,type指定字段类型,default默认值,comment注释
- 联合索引,及自定义数据库的表名
- 表之间关联关系
- 多对一 (Belongs to ) 一对多(has many) ,在数据库中时一样的
- 多对多 AutoMigrate时会自动创建第三张表
- 常规两种表示方法:Create的时候如果写了引用字段,会将另外两张表一同插入(如果id已经存在,则不插入,只插入第三张表)
- 也可以用多对一的方式这样表示多对多
去年八月份,gorm 已经升级成V2版了,做下记录
gorm每种操作都提供了大量的方法,对程序员非常不友好
批量插入
要有效地插入大量记录,请将一个 slice 传递给 Create 方法。 将切片数据传递给 Create 方法,GORM 将生成一个单一的 SQL 语句来插入所有数据,并回填主键的值,钩子方法也会被调用。
var users = []User{{Name: "jinzhu1"}, {Name: "jinzhu2"}, {Name: "jinzhu3"}}
db.Create(&users)
for _, user := range users {
user.ID // 1,2,3
}
使用 CreateInBatches 创建时,你还可以指定创建的数量,例如:
var users = []User{{name: "jinzhu_1"}, ...., {Name: "jinzhu_10000"}}
// 数量为 100
db.CreateInBatches(users, 100)
根据 Map 创建
GORM 支持根据 map[string]interface{} 和 []map[string]interface{}{} 创建记录,例如:
db.Model(&User{}).Create(map[string]interface{}{
"Name": "jinzhu", "Age": 18,
})
// batch insert from []map[string]interface{}{}
db.Model(&User{}).Create([]map[string]interface{}{
{"Name": "jinzhu_1", "Age": 18},
{"Name": "jinzhu_2", "Age": 20},
})
标签
index索引,type指定字段类型,default默认值,comment注释
type User struct {
BaseModel
OpenID string `gorm:"index:idx_mobile;unique;type:varchar(30);not null"`
Role int `gorm:"column:role;default:1;type:int; comment:'1表示普通用户, 2表示管理员'"`
}
联合索引,及自定义数据库的表名
type GoodsCategoryBrand struct {
BaseModel
CategoryID int32 `gorm:"type:int;index:idx_category_brand,unique"`
Category Category
BrandsID int32 `gorm:"type:int;index:idx_category_brand,unique"`
Brands Brands
}
func (GoodsCategoryBrand) TableName() string{
return "goodscategorybrand"
}
表之间关联关系
表示外键时要注意,如下例:CompanyID 和 Company的ID 字段类型一定要一样,否则外键会出错
多对一 (Belongs to ) 一对多(has many) ,在数据库中时一样的多对一
// `User` 属于 `Company`,`CompanyID` 是外键
type User struct {
gorm.Model
Name string
CompanyID int
Company Company
}
type Company struct {
ID int
Name string
}
一对多
// User 有多张 CreditCard,UserID 是外键
type User struct {
gorm.Model
Name string
CompanyID uint
}
type Company struct {
gorm.Model
Name string
Users []User
}
自引用
type Category struct{
BaseModel
Name string `gorm:"type:varchar(20);not null" json:"name"`
ParentCategoryID int32 `json:"parent"`
ParentCategory *Category `json:"-"`
SubCategory []*Category `gorm:"foreignKey:ParentCategoryID;references:ID" json:"sub_category"`
Level int32 `gorm:"type:int;not null;default:1" json:"level"`
IsTab bool `gorm:"default:false;not null" json:"is_tab"`
}
或
type User struct {
gorm.Model
Name string
ManagerID *uint
Team []User `gorm:"foreignkey:ManagerID"`
}
多对多 AutoMigrate时会自动创建第三张表
常规两种表示方法:Create的时候如果写了引用字段,会将另外两张表一同插入(如果id已经存在,则不插入,只插入第三张表)
// User 拥有并属于多种 language,`user_languages` 是连接表
type User struct {
gorm.Model
Languages []Language `gorm:"many2many:user_languages;"`
}
type Language struct {
gorm.Model
Name string
}
或这样表示(更建议)
// User 拥有并属于多种 language,`user_languages` 是连接表
type User struct {
gorm.Model
Languages []*Language `gorm:"many2many:user_languages;"`
}
type Language struct {
gorm.Model
Name string
Users []*User `gorm:"many2many:user_languages;"`
}
也可以用多对一的方式这样表示多对多
这里建立了联合索引
type UserLanguage struct {
gorm.Model
UserID int32 `gorm:"type:int;index:idx_user_language,unique"`
User User
LanguageID int32
Language Language `gorm:"type:int;index:idx_user_language,unique`
}



