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)是一种用于优化数据库连接管理的技术。它通过在应用程序初始化阶段创建一组数据库连接,并在需要时重复使用这些连接,从而减少了每次请求时都建立和断开数据库连接的开销。
连接池的优点:
- 连接重用: 连接池将数据库连接保持在打开状态,以便它们可以在多个请求之间重复使用,而不是在每个请求时都重新创建连接。
- 连接管理: 连接池会负责分配和回收数据库连接,确保连接的正确使用。这包括在连接超时、出现问题或不再需要时关闭连接。
- 性能提升: 通过避免频繁的连接和断开操作,连接池可以减少连接建立的开销,从而提高应用程序的性能。
- 资源控制: 连接池可以限制同时打开的连接数量,以防止过多的连接占用数据库服务器的资源。
- 连接可靠性: 连接池可以监控连接的健康状态,当连接出现问题时,连接池可以自动替换或重新创建连接。
- 适应压力: 在高并发情况下,连接池可以帮助管理连接的请求,以防止数据库连接过载。
连接池的配置参数可以根据应用程序的需要进行调整,例如最大连接数、最小连接数、连接超时时间等。
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作为要新建的表里的一列,就会在表中添加以下的列
增加新的元素
- 新建一个该结构体,然后db.create创建一个新元素
user := User{Name: "张三", Id:1,Password:123456}
result := db.Create(&user)
-
一次性创建很多的新元素
(1)创建一个数组,里面有很多该结构体,然后进行db.create 来进行创建
var users = []User{{Name: "a",......}, {Name: "b",.....}, {Name: "c",.....}}
db.Create(&users)
(2)如果想要分批的进行创建,那么就要使用db.createinbatches,后面接上两个餐宿,对象结构体的数组,和分批每次的批量是多少
查找元素
- 查找单个元素
下面三者分别是获取第一条记录,获取任意一条记录和获取最后一条记录
// 获取第一条记录
db.First(&user)
// 获取一条记录
db.Take(&user)
// 获取最后一条记录
db.Last(&user)
//find里面传一个user对象就是指在User这个表中进行查找,并且把值传到user这个对象里面
- 获取几个元素 (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这个对象里面
-
跳过几个元素(Offset指定在开始返回记录之前要跳过的记录数量)
db.Offset(3).Find(&users) // SELECT * FROM users OFFSET 3; db.Limit(10).Offset(5).Find(&users)
-
条件和限制查找
-
利用主键查找(找主键是什么,或者主键在什么范围内的)
db.First(&user, 10) db.First(&user, "10") // 选择user表中主键为10的 db.Find(&users, []int{1,2,3}) //选择主键在1,2,3这个范围内的 //find里面传一个user对象就是指在User这个表中进行查找,并且把值传到user这个对象里面 -
限定条件索引(用.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{})
// 删除名字中含有张三的