使用 GORM进行增删查改| 青训营

121 阅读6分钟

GORM框架的使用

Gorm框架的安装

首先设置国内代理,不然能顺利安装才怪

 $env:GO111MODULE = "on"
 $env:GOPROXY = "https://goproxy.cn"
 go get -u gorm.io/gorm
 go get -u gorm.io/driver/mysql

注意,这里是你需要使用什么样的数据库,driver后面改成哪个数据库


数据库连接

数据库的连接

dsn := "用户名:该用户的密码@tcp(127.0.0.1:3306这里填数据库对应的网址和接口,本机的话就是localhost(127.0.0.1):3306)/数据库的名字?charset=utf8mb4&parseTime=True&loc=Local"//进行数据库的连接,如果连接失败就会爆error,进行捕获error
    db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
    if err != nil {
        panic(err)
    }

如果没有报错,那么就说明我们的数据库连接成功了

数据库的连接池

当涉及到与数据库进行交互的应用程序时,数据库连接的管理是一个重要的方面。数据库连接池(Database Connection Pool)是一种用于优化数据库连接管理的技术。它通过在应用程序初始化阶段创建一组数据库连接,并在需要时重复使用这些连接,从而减少了每次请求时都建立和断开数据库连接的开销

连接池的优点:

  1. 连接重用: 连接池将数据库连接保持在打开状态,以便它们可以在多个请求之间重复使用,而不是在每个请求时都重新创建连接。
  2. 连接管理: 连接池会负责分配和回收数据库连接,确保连接的正确使用。这包括在连接超时、出现问题或不再需要时关闭连接。
  3. 性能提升: 通过避免频繁的连接和断开操作,连接池可以减少连接建立的开销,从而提高应用程序的性能。
  4. 资源控制: 连接池可以限制同时打开的连接数量,以防止过多的连接占用数据库服务器的资源。
  5. 连接可靠性: 连接池可以监控连接的健康状态,当连接出现问题时,连接池可以自动替换或重新创建连接。
  6. 适应压力: 在高并发情况下,连接池可以帮助管理连接的请求,以防止数据库连接过载。

连接池的配置参数可以根据应用程序的需要进行调整,例如最大连接数、最小连接数、连接超时时间等。

gorm中也有连接池的概念:在进行连接了之后可以进行连接池的管理

//首先先进行前面代码中的数据库的连接
//然后我们使用db.DB()创建一个用来管理连接池的对象
pool, err := db.DB()
​
// SetMaxIdleConns 设置空闲连接池中连接的最大数量
pool.SetMaxIdleConns(10)
​
// SetMaxOpenConns 设置打开数据库连接的最大数量。
pool.SetMaxOpenConns(100)
​
// SetConnMaxLifetime 设置了连接可复用的最大时间。
pool.SetConnMaxLifetime(time.Hour)

表的建立

gorm中建立表的过程,gorm中建立表的时候首先要建立一个结构体,结构体中的每一个数据项就是表中的每一个数据,然后在进行连接之后,使用连接了的db 对象对我们建立的结构体进行一个 autoMigrate即可

type User struct {
    Id     uint
    Name   string
    Password string
}
​
    //连接db对象
    //进行自动迁移,没有表就进行创建
    db.AutoMigrate(&Userinfo{})

值得注意的是,可以在创建的表中加入一个gorm.Model作为要新建的表里的一列,就会在表中添加以下的列

image.png

image.png


增加新的元素

  1. 新建一个该结构体,然后db.create创建一个新元素
user := User{Name: "张三", Id:1,Password:123456}
​
result := db.Create(&user) 
  1. 一次性创建很多的新元素

    (1)创建一个数组,里面有很多该结构体,然后进行db.create 来进行创建

var users = []User{{Name: "a",......}, {Name: "b",.....}, {Name: "c",.....}}
db.Create(&users)

(2)如果想要分批的进行创建,那么就要使用db.createinbatches,后面接上两个餐宿,对象结构体的数组,和分批每次的批量是多少


查找元素

  1. 查找单个元素

下面三者分别是获取第一条记录,获取任意一条记录和获取最后一条记录

// 获取第一条记录
db.First(&user)
// 获取一条记录
db.Take(&user)
// 获取最后一条记录
db.Last(&user)
//find里面传一个user对象就是指在User这个表中进行查找,并且把值传到user这个对象里面
  1. 获取几个元素 (Limit指定获取记录的最大数量)
db.Limit(3).Find(&users)
// SELECT * FROM users LIMIT 3;// 通过 -1 消除 Limit 条件
db.Limit(10).Find(&users1).Limit(-1).Find(&users2)
//find里面传一个user对象就是指在User这个表中进行查找,并且把值传到user这个对象里面
  1. 跳过几个元素(Offset指定在开始返回记录之前要跳过的记录数量)

    db.Offset(3).Find(&users)
    // SELECT * FROM users OFFSET 3;
    ​
    db.Limit(10).Offset(5).Find(&users)
    
  1. 条件和限制查找

    1. 利用主键查找(找主键是什么,或者主键在什么范围内的)

      db.First(&user, 10)
      db.First(&user, "10")
      // 选择user表中主键为10的
      ​
      db.Find(&users, []int{1,2,3})
      //选择主键在123这个范围内的
      //find里面传一个user对象就是指在User这个表中进行查找,并且把值传到user这个对象里面
      
    2. 限定条件索引(用.where()来进行对限定条件的限定,第一个参数为限定的是什么,对于待定的数值(要传进来的打上问号),剩下的参数就是打了几个文化传进去几个参数)

      如果要选不是什么的,就把 where换成not即可,或者你自己算一下你逻辑表达式的取反是什么

db.Where("name = ?", "张三").First(&user)
db.Where("name = ? AND age >= ?", "张三", "22").Find(&users)
//其中这两个中的where分别是选出名字叫做张三的和名字叫做张三且年龄在22以上的学生
//find里面传一个user对象就是指在User这个表中进行查找,并且把值传到user这个对象里面

用update更新单列,用 updates更新多列的数据

更新单列:

// 条件更新
db.Model(&User{}).Where("password = ?", "123").Update("name", "ssg")
// 这个orm语句的意思是首先先找到一个password=123的用户,然后把它的name更新成ssg 
​
db.First(&user)
// 获取到表中的第一个的用户先
db.Model(&user).Update("name", "123")
//选择出刚才那个找出来的第一个用户,把它的名字改成123

更新多列:

//更新多列
db.First(&user)
db.Model(&user).Updates(User{Name: "dnk1234567", Age: 0, password:"long"})
//指定更新那些列,这里选定了name和age
db.Model(&user).Select("Name", "Age").Updates(User{Name: "new_name", Age: 0})

与更新单列用的update不同,这里不是传入两个参数列名和对应的值,这里是你新建一个对象然后里面更新那些列写哪些列对应的参数


进行删除

db.Delete()即可进行删除

db.Delete(&User{}, 10)
//删除主键id是10的
db.Where("name LIKE ?", "%张三%").Delete(&Email{})
// 删除名字中含有张三的