Go语言Gorm框架基础知识代码示例(1) | 青训营笔记

109 阅读3分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 6 天

本文开始,将进行Gorm的学习,仍然是记录学习时使用的代码例子

本项目结果目前如下:

image.png

项目使用的数据库是MySQL。安装完gorm后,也要安装MySQL的驱动
model目录下放了几个结构体作为实例model,main下即是main函数

Users代码如下

type Users struct {
   ID           int    `gorm:"column:userId;primaryKey"`
   UserName     string `gorm:"column:userName"`
   UserPassword string `gorm:"column:userPassword"`
   //gorm.Model   `gorm:"-"`
   CreatedAt time.Time `gorm:"column:createAt;"`
}

UserInfo代码如下

type UserInfo struct {
   InfoId int    `gorm:"primaryKey,column:InfoId"`
   Info   string `gorm:"column:Info"`
}

数据库结构如下

image.png

请看表结构
users表

image.png

userInfo表(虽然不重要)

image.png


请看Main函数

涉及非常多,但无非是两部分,数据的创建插入与查找,数据的修改与删除回头再写
代码中有许多对于方法的注释与个人理解,此处不再赘述
想要运行某部分时,请将对应部分的注释代码块删去即可进行运行

package main

import (
   "Gorm1/model"
   "fmt"
   "gorm.io/driver/mysql"
   "gorm.io/gorm"
)

func insertUser(id int, userName string, userPassword string, hasId bool, db *gorm.DB) {
   user1 := model.Users{}
   user1.UserName = userName
   user1.UserPassword = userPassword
   if hasId {
      user1.ID = id
   }
   result := db.Create(&user1)
   if result.Error != nil {
      fmt.Println("Insert ERROR!>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>")
      return
   }

   fmt.Println(result.RowsAffected)
}

func main() {
   dsn := "root:root@tcp(localhost:3306)/userLogin"
   db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})

   if err != nil {
      fmt.Println("Connection ERROR!>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>")
      return
   }

   //insertUser(0, "Hi", "hhh", false, db)
   //insertUser(5, "HiHi", "hhh", true, db)

   /**
   user1 := model.Users{
      ID:           6,
      UserName:     "a",
      UserPassword: "aa",
      CreatedAt:    time.Time{},
   }



   */

   //创建记录并更新给出的字段。
   //创建一个记录且一同忽略传递给略去的字段值。

   //db.Select("UserName", "UserPassword").Create(&user1)
   //db.Omit("UserName").Create(&user1)

   //插入多个
   //通过切片传给create

   //var users = []model.Users{{UserName: "first"}, {UserName: "second"}, {UserName: "third"}}
   //db.Create(&users)

   //通过CreateInBatches方法
   /**
   var users2 = []model.Users{{UserName: "first1"}, {UserName: "second2"}, {UserName: "third3"}}
   //两个参数,第一个是切片好理解,第二个参数是每批插入数量,比如现在是1,每批插入1个插入三次
   db.CreateInBatches(users2, 1)
   */
   /**
   //Hook函数
   var user1 = User{
      UserName:     "OK",
      UserPassword: "OKK",
   }
   db.Create(&user1)
   */

   //查询
   /**


   //一般查询
   user3 := model.Users{}
   // SELECT * FROM `users` ORDER BY `users`.`userId` LIMIT 1
   db.Debug().First(&user3)
   fmt.Println(user3)

   user4 := model.Users{}
   // SELECT * FROM `users` ORDER BY `users`.`userId` DESC LIMIT 1
   db.Debug().Last(&user4)
   fmt.Println(user4)

   user5 := model.Users{}
   //  SELECT * FROM `users` LIMIT 1
   db.Debug().Take(&user5)
   fmt.Println(user5)

   //以下三个根据特定主键查询
   //SELECT * FROM `users` WHERE `users`.`userId` = 10 ORDER BY `users`.`userId` LIMIT 1
   user6 := model.Users{}
   db.Debug().First(&user6, 10)
   fmt.Println(user6)

   //SELECT * FROM `users` WHERE `users`.`userId` = '15' ORDER BY `users`.`userId` LIMIT 1
   user7 := model.Users{}
   db.Debug().First(&user7, "15")
   fmt.Println(user7)

   //声明切片查询全部
   // SELECT * FROM `users` WHERE `users`.`userId` IN (5,6,7) ORDER BY `users`.`userId` LIMIT 1
   var user8 []model.Users
   db.Debug().Find(&user8, []int{5, 6, 7})
   fmt.Println(user8)
   */

   /**




   //where,or与not查询

   //查询一个
   // SELECT * FROM `users` WHERE userName=7 ORDER BY `users`.`userId` LIMIT 1
   user3 := model.Users{}
   //请注意此处的query必须和数据库中名称一样,而不是结构体中的命名
   db.Where("userName=?", 7).Debug().First(&user3)
   fmt.Println(user3)

   //查询所有符合条件
   //SELECT * FROM `users` WHERE userName='aaaa'
   var user4 []model.Users
   db.Where("userName=?", "aaaa").Debug().Find(&user4)
   fmt.Println(user4)

   //还可以查询in like and between 等许多
   //查询struct与map
   //传入struct
   var user5 = model.Users{
      UserName: "8",
   }
   //注意,此处where的参数为一个带有要查询参数的结构体,First参数为返回的结构体,二者不为同一个
   //SELECT * FROM `users` WHERE `users`.`userName` = '8' ORDER BY `users`.`userId` LIMIT 1
   db.Where(&user5).Debug().First(&user5)
   fmt.Println(user5)

   //map查询
   //大同小异,只是where参数为map
   var user6 []model.Users
   // SELECT * FROM `users` WHERE `userName` = '9' AND `userPassword` = '9' ORDER BY `users`.`userId` LIMIT 1
   db.Where(map[string]interface{}{"userName": "9", "userPassword": "9"}).Debug().First(&user6)
   fmt.Println(user6)

   //slice查询
   var user7 []model.Users
   // SELECT * FROM `users` WHERE `users`.`userId` IN (5,8)
   db.Where([]int64{5, 8}).Debug().Find(&user7)
   fmt.Println(user7)

   //not查询与where类似
   var user8 = []model.Users{}
   //SELECT * FROM `users` WHERE NOT userName='aaaa'
   db.Not("userName=?", "aaaa").Debug().Find(&user8)
   for _, users := range user8 {
      fmt.Println(users)
   }

   //or的使用
   //SELECT * FROM `users` WHERE userName='FUCKYOU!' OR userName='9'
   var user9 = model.Users{}
   db.Where("userName=?", "FUCKYOU!").Or("userName=?", "9").Debug().Find(&user9)
   fmt.Println(user9)

   //内联条件与where类似
   //SELECT * FROM `users` WHERE userName <>'aaaa' and userPassword <>'null'
   var user10 = []model.Users{}
   db.Find(&user10, "userName !=? and userPassword <>?", "aaaa", "null")
   for _, users := range user10 {
      fmt.Println(users)
   }


   */

   //选取特定字段Select,内部为类别名称,后面使用Order对类进行排序,Table选择表
   // SELECT `userId`,`userName`,`userPassword` FROM `users` ORDER BY userId desc
   var users []model.Users
   db.Table("users").Select("userId", "userName", "userPassword").Order("userId desc").Debug().Find(&users)
   fmt.Println(users)

   //其他
   //Limit与Offset,前者为检索出最大记录数量,后者为偏移数即忽略数量,Count获取记录总数
   //Joins链接查询
   //Pluck,查询 model 中的一个列作为切片,如果您想要查询多个列,您应该使用 Scan
   //Scan扫描结果至一个struct
}

// User 与 Hook函数
type User struct {
   UserName     string `gorm:"column:userName"`
   UserPassword string `gorm:"column:userPassword"`
}

func (u *User) BeforeCreate(db *gorm.DB) (err error) {
   fmt.Println("Inserting...")
   return err
}

我参考了几篇文章,如下

参考文章1->>>>查询 | GORM - The fantastic ORM library for Golang, aims to be developer friendly.
参考文章2->>>>