GORM基本用法以及多表关联

622 阅读3分钟

GORM基本用法

1. 通过gorm连接数据库更加简洁:

func main() {
    db, err := gorm.Open(
    mysql.Open(“user:passwd@tcp()”))
    var users []User
    err = db.Select(“id”, “name”).Find(&users, 1).Error
}

2. 操作数据库时更加简单,包括CURD。

参考文档 learnku.com/docs/gorm/v…

参考文档:gorm.io/zh_CN/docs/…

db.AutoMigrate(),AutoMigrate 会创建(新的)表、缺少的外键、约束、列和索引,并且会更改现有列的类型(如果其大小、精度、是否为空可更改的话)。但不会删除未使用的列,以保护现存的数据。

db.First(&product, 1)查询id为1的product

db.First(&product, “code=?”, “1212”)查询code=1212的product

db.Model(&tablename).Update(Column, 2000)更新列为2000

// 条件更新,相当于 UPDATE users SET name='hello', updated_at='2013-11-17 21:34:10' WHERE active=true;

db.Model(&User{}).Where("active = ?", true).Update("name", "hello")

3.GORM多表关联(has_one一对一关联)

belongs to 会与另一个模型建立了一对一的连接。 这种模型的每一个实例都“属于”另一个模型的一个实例。

例如:每个 user 能且只能被分配给一个 company

// User 属于 Company

type User struct {  
  gorm.Model  
  Name      string
// `CompanyID`被隐含地用来在`User`和`Company`之间创建一个外键关系  
  CompanyID int   Company   Company  
}  
  
type Company struct {  
  ID   int  
  Name string  
}

要定义一个 belongs to 关系,数据库的表中必须存在外键. GORM同时提供自定义外键名字的方式,如下例所示。

type User struct {  
  gorm.Model  
  Name         string  
  CompanyRefer int  
  Company      Company `gorm:"foreignKey:CompanyRefer"`  
  // 使用 CompanyRefer 作为外键  
}

可以通过gorm关键字重写外键和重写引用,什么是外键,什么是引用?为什么要重写外键和引用而不是直接在代码上修改?

参考文档:blog.csdn.net/sunriseYJP/…

外键:这个模型和另一个模型连接起来的字段

例如:

// User 有一张 CreditCard,UserID 是外键

type User struct {
  gorm.Model
  CreditCard CreditCard

}

type CreditCard struct {
  gorm.Model
  Number string
  UserID uint
}

在数据表CreditCard中,会出现一列user_id字段,这个就是CreditCard的外键,默认就是User的结构体,想要修改这个外键名可以用gorm关键字修改。

引用

默认情况下,拥有者实体会将 has one 对应模型的主键保存为外键,您也可以修改它,用另一个字段来保存,例如下面这个使用 Name 来保存的例子。可以使用标签 references 来更改它。

type User struct {
  gorm.Model
  Name       string     `gorm:"index"`
  CreditCard CreditCard `gorm:"foreignkey:UserName;references:name"`
}

type CreditCard struct {
  gorm.Model
  Number   string
  UserName string
}

一般情况下,需要同时重写外键和重写引用,这样在CreditCard中就会将另一个字段作为外键存储。

GORM多表关联(has_many一对一关联)

// User 有多张 CreditCard,UserID 是外键  
type User struct {  
  gorm.Model  
  CreditCards []CreditCard  
}  
  
type CreditCard struct {  
  gorm.Model  
  Number string  
  UserID uint  
}

表示User中有多张CreditCard表,同样拥有重写外键和重写引用

参考文档:juejin.cn/post/706713… 该文档中一对多用学生和班级举例更合适。

type ClassEntity struct {
     Id  int `json:"id" gorm:"type:int(11);autoIncrement;primaryKey;column:id;`
     Name string  `json:"name"`
      // 一个班级中有多个学生foreignKey表示外键关联的字段
     StudentList []*StudentEntity `json:"student_list" gorm:"foreignKey:ClassId"`
}

 

type StudentEntity struct {
     Id int `json:"id" gorm:"type:int(11);autoIncrement;primaryKey;column:id;`
     Name string `json:"name"`
      // 外键关联到班级表的数据模型
     ClassId int `json:"class_id"`
}
// StudentEntity类方法
func (StudentEntity) TableName() string {
     return "student"
}
// ClassEntity类方法
func (ClassEntity) TableName() string {
     return "class"
}

func init() {
     utils.GormDb.AutoMigrate(&ClassEntity{}, &StudentEntity{})
}