栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Go语言

gormV2笔记

Go语言 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

gormV2笔记

文章目录
    • 标签
      • 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`
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/991549.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号