使用 GORM(Go 的 ORM 库)连接数据库 | 青训营

222 阅读3分钟

使用 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 ,我们这个时候只要把目录结构改一下 直接打开我们项目的目录就会解决。

解决方案参考:go mod 启动以后安装第三方(girhub)包,且已经在pkg/mod/下生成了第三方包,但是vacode还是报错could not import github.com/ 的原因could not import github.com/mlogclub/simple/common努力搬砖1122的博客-CSDN博客

在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;