使用 GORM(Go 的 ORM 库)连接数据库
首先,创建文件main.go,并用go mod init初始化项目所在文件夹,go mod tidy添加相关依赖。
创建文件夹models,创建文件UserBasic.go,并用go get gorm.io/gorm命令import gorm。
这一步报错:could not import gorm.io/gorm (current file is not included in a workspace module)
解决:原因是第三方包在有src目录的情况下会默认在src目录下找,所以一直报 could not import ,我们这个时候只要把目录结构改一下 直接打开我们项目的目录就会解决。
在UserBasic.go中,定义结构体UserBasic,如下:
type UserBasic struct {
gorm.Model
Name string
Password string
Phone string
Email string
Identity uint64
ClientIP string
ClientPort string
LoginTime uint64
HeartbeatTime uint64
LogOutTime uint64
IsLogout bool
DeviceInfo string
}
定义一个TableName()方法,参数为UserBasic指针,返回一个string。
func (table *UserBasic) TableName() string{
return "user_basic"
}
创建test文件夹,在其下创建testGorm.go,并使用go get gorm.io/driver/mysql 导入mysql。
在main()函数中,首先调用gorm的Open()函数连接数据库。
db,err:=gorm.Open(mysql.Open("test.db"),&gorm.Config{})
if err!=nil{
panic("fail to connect database")
}
连接数据库后,调用db的AutoMigrate()方法,自动创建或更新数据库表结构。
db.AutoMigrate(&models.UserBasic{})
此函数的参数为我们要创建或更新的数据库表对应的模型结构体。
“gorm AutoMigrate是gorm框架提供的一个数据库迁移工具,它可以自动创建或更新数据库表结构。gorm AutoMigrate会根据定义的模型结构体,自动创建或更新对应的数据库表结构。”
来源:Gorm AutoMigrate指定表名 - TeHub
接下来,调用db的Create()方法创建记录。
user:=&models.UserBasic{}
user.Name="David"
db.Create(user)
有了记录以后,我们可以对记录进行增删改查操作。
1)查询操作
查询操作可以调用First()方法,查询表中的第一条数据(按主键升序排列),并打印。
同理,Last()方法可以查询最后一条数据(主键降序排列)。
没有定义主键,则按第一个字段排序。
fmt.Println(db.First(user,1))
fmt.Println(db.Last(user))
①指定排序
例:按Identity降序排列
// SELECT * FROM users ORDER BY Idebtity desc;
db.Order("Identity desc").Find(&users)
②条件查询
可以调用Find()方法。例:查询identity为1、 2或3的user。
db.Find(&users, []int{1,2,3}) // SELECT * FROM users WHERE id IN (1,2,3);
调用Where()方法。例:查询name为David、Password为1234的记录。
db.Where("Name = ? AND Password >= ?", "David", "1234").Find(&users)
2)更新操作
调用Update(),更新一个字段。调用Updates,更新多个字段(仅更新非零字段)。
db.Model(user).Update("Password","1234")
db.Model(user).Updates(models.UserBasic{Name:"Tom",Password: "5678"})
还可以将查询和更新一起进行:
db.Model(user).Where("Identity=?", 1).Update("Password", "1234")
3)删除操作
调用Delete()方法。
db.Delete(user, "1")
批量删除可以先调用Where()方法,再Delete().
db.Where("Email LIKE ?", "%qq.com%").Delete(user)
经查询,删除还分为软删除和永久删除,通过阅读golang 学习笔记(8)-gorm实现删除功能golang+grom批量删除-logieeU的博客-CSDN博客,整理如下:
①软删除:拥有软删除能力的模型调用 Delete 时,记录不会从数据库中被真正删除。但 GORM 会将 DeletedAt 置为当前时间, 并且你不能再通过普通的查询方法找到该记录。
可以使用 Unscoped 找到被软删除的记录。
db.Unscoped().Where("age = 20").Find(&users)
// SELECT * FROM users WHERE age = 20;
②永久删除(物理删除)
可以使用 Unscoped 永久删除匹配的记录。
db.Unscoped().Delete(&order)
// DELETE FROM orders WHERE id=10;
同时,还从中学习到了:当传入的模型指针内含主键,则会自动将主键当作条件,如下:
user:=&User{Identity:1}
db.Delete(user)
// DELETE FROM users WHERE Identity=1;