GORM | 青训营笔记

43 阅读2分钟

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

GORM

引入驱动

import "gorm.io/driver/mysql"

连接数据库

import (
 "gorm.io/driver/mysql"
  "gorm.io/gorm"
)
​
func main() {
    
  ds :="username:password(127.0.0.1:3306)/db1?charset=utf8mb4&parseTime=True&loc=Local"
    db, err := gorm.Open(mysql.Open(ds), &gorm.Config{})
}
​

连接mysql驱动需要参数,从左到右为用户名,密码,数据库对应的Ip地址和端口号,数据库名,编码格式。

GORM Model

结构体
type User struct {
  ID           uint
  Name         string
  Email        *string
  Age          uint8
  Birthday     *time.Time
  MemberNumber sql.NullString
  ActivatedAt  sql.NullTime
  CreatedAt    time.Time  //记录创建时间
  UpdatedAt    time.Time  //记录更新时间
}
字段标签
  • column 指定db列名
  • primaryKey 指定列为主键
  • unique 指定列为唯一

GORM操作mysql

package main
​
import (
    "fmt"
    "gorm.io/driver/mysql"
  "gorm.io/gorm"
)
​
// UserInfo 用户信息
type UserInfo struct {
    ID uint
    Name string
    Gender string
    Hobby string
}
​
//自定义表名
func (UserInfo) TableName() string {
    return "user"
}
​
​
func main() {
    dsn:="root:123456@(127.0.0.1:3306)/db1?charset=utf8mb4&parseTime=True&loc=Local"
    db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
    if err!= nil{
        panic(err)
    }
    
​
    // 自动迁移
    db.AutoMigrate(&UserInfo{})
​
    u1 := UserInfo{1, "李华", "男", "篮球"}
    u2 := UserInfo{2, "刘丽", "女", "足球"}
    // 创建记录
    db.Create(&u1)
    db.Create(&u2)
    // 查询
    var u = new(UserInfo)
    db.First(u)
    fmt.Printf("%#v\n", u)
​
    var uu UserInfo
    db.Find(&uu, "hobby=?", "足球")
    fmt.Printf("%#v\n", uu)
​
    // 更新
    db.Model(&u).Update("hobby", "双色球")
    // 删除
    db.Delete(&u)
}

CRUD接口

创建记录
user := User{Name: "Jinzhu", Age: 18, Birthday: time.Now()}
db.Create(&user) 
插入数据
func InsertStu(user model.Student) error {
   deres := db.Select("Name", "Password", "MajorNum").Create(&model.Student{Name: user.Name, Password: user.Password, MajorNum: user.MajorNum})
   err := deres.Error
   if err != nil {
      fmt.Printf("insert failed, err:%v\n", err)
      return err
   }
   return err
}
删除数据
func DeleteTCourse(id int) error {
   var Course []model.TCourse
   dbRes := db.Where("Id = ?", id).Delete(&Course)
   err := dbRes.Error
   if err != nil {
      fmt.Printf("delete failed, err:%v\n", err)
      return err
   }
   return err
}
数据更改
func UpdateStuPassword(id int, newPassword string) error {
   deRes := db.Model(&model.Student{}).Where("Id = ?", id).Update("Password", newPassword)
   err := deRes.Error
   if err != nil {
      fmt.Printf("update failed, err:%v\n", err)
      return err
   }
   return err
}
数据查询
func SelectQuestionByStuId(id int) string {
   user := model.Student{}
   db.Model(&model.Student{}).Select("question").Where("Id = ?", id).Find(&user)
   return user.Question
}
事务实现
func InsertStuCourse(course model.StuCourse, credit float64) error {
   stu := model.Student{}
   err := db.Transaction(func(tx *gorm.DB) error {
      if err := tx.Select("StudentNum", "TCourseNum", "Time").Create(&model.StuCourse{StudentNum: course.StudentNum, TCourseNum: course.TCourseNum, Time: course.Time}).Error; err != nil {
         return err
      }
      if err := tx.Model(&model.TCourse{}).Where("id = ?", course.TCourseNum).Update("Num", gorm.Expr("Num + 1")).Error; err != nil {
         return err
      }
      if err := tx.Model(&model.Student{}).Where("id = ?", course.StudentNum).Update("Credit", gorm.Expr("Credit + ?", credit)).Error; err != nil {
         return err
      }
      if err := tx.Model(&model.Student{}).Select("Credit").Where("id = ?", course.StudentNum).Find(&stu).Error; err != nil {
         return err
      }
      fmt.Println(stu.Credit)
      if stu.Credit >= 28 {
         tx.Rollback()
      }
      return nil
   })
   if err != nil {
      fmt.Printf("insert failed, err:%v\n", err)
      return err
   }
   return err
}