使用 GORM(Go 的 ORM 库)连接数据库,并实现增删改查操作 | 青训营

59 阅读4分钟

本文记录使用GORM连接数据库,并实现增删改查操作的全过程,作为实践记录。

安装Mysql

这个如果有做过开发的同学肯定电脑上都有吧,如果没有可以去下载一下,现在一般都用8.28那个版本了吧。 默认的Mysql只能在命令行里面使用,不是很友好:

image.png 可以使用一些图形化工具,这样就比较舒服了。常用的图形化工具有SQLyog,dataGrip等等,不过很多都要钱,有一个免费的dbeaver社区版本,我一直用的还挺舒服的: dbeaver

image.png

这是它的页面,创建数据库表什么的很方便。

准备数据库

首先创建一个数据库go_db

CREATE DATABASE `go_db` /*!40100 DEFAULT CHARACTER SET utf8 */ /*!80016 DEFAULT ENCRYPTION='N' */;

Gorm

orm即对象关系映射,是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系数据库中。

下载

Go里面下载非常轻松惬意,只需要打开工作目录终端即可,输入下面两行命令:

go get -u gorm.io/gorm
go get -u gorm.io/driver/mysql

下载完之后就可以使用了

尝试连接

查阅官方文档可以得到Gorm尝试连接的代码

func main() {  
dsn := "root:aaa24331277@tcp(127.0.0.1:3306)" +  
"/go_db?charset=utf8mb4&parseTime=True&loc=Local"  
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})  
if err != nil {  
panic("连接数据库失败")  
}  
  
}

dsn其实就可以理解成你去连接数据库的那个路径,需要根据自己本机实际的端口和用户名密码做更改,后面的那些是mysql8需要对字符集的设置之类的。

尝试创建一个表

首先创建一个结构体作为我们的表,也就是说在Gorm里结构体的结构和表结构存在一个对应关系,这样我们就很方便去检查和维护。如果学过SpringBoot应该对这个并不陌生

type Product struct {  
gorm.Model  
Code string  
Price uint  
}

然后运行数据迁移就能在数据库中创建一个表了,数据库中表的名字默认是结构体名称小写加s

db.AutoMigrate(&Product{})

image.png 观察表结构,发现了什么?对,我们并没有自己手动去创建id、创建、更新、修改时间,而gorm全部帮我们都做好了!也就是Product的gorm.model里面继承而来的属性。这实在是太方便了。记得在写SpringBoot的时候,这些东西都要自己手动去维护,即使用一些自动化技术,也要引入注解等等很是不方便,而在Gorm这里这是一套给你打包好的!不禁折服于这种进步。

尝试添加元素

添加一个元素类似于MybatisPlus,给一个结构体赋值好,然后调用Api创建即可。

p := Product{  
Code: "114514",  
Price: 100,  
}  
db.Create(&p)

image.png 这么简单就成功插入了一条数据,并且注意到他的时间字段不仅是自动填充,还是我们最喜欢的格式!

查询数据

//db.Create(&p)  
// 查询主键为2数据 db.First(&p, 2)  
// 查询某字段  
db.First(&p, "price = ?", "666")  
fmt.Printf("%+v\n", p)

可以按照主键,或者按照字段值查询。如果你查的那个数据不在数据库中,那么也会给你提示:

image.png

其实就是查询到的数据会被绑定到你传入的那个结构体指针上,然后那个结构体的值就变成了你要查询的值。

更新数据

更新数据也很简单,就是先查出你要更新的那个数据,然后接上你要更新的字段和值就可以了。

db.First(&p, 1).Update("price", 666666)

可以嵌套的写,比较简便。 当然也可以同时更新多个字段值,使用的是Updates,有两种方式,可以用结构体也可以用万能空接口

//db.First(&p, 1).Updates(map[string]interface{}{"price": 0, "code": "6678"})  
db.First(&p, 2).Updates(Product{Price: 222, Code: "xyz"})

删除数据

删除主键为2的数据

db.Delete(&p, 2)

注意,当我们执行这个语句的时候观察表,发现数据并没有真的删除,这也是Gorm厉害的地方,他的东西都足够先进好用。现在提倡的都是逻辑删除而不是物理删除,所谓删除只是在数据库里给他的删除字段打上标记而已:

image.png