使用GORM连接数据库| 青训营

166 阅读5分钟

前言

数据库是后端编程中无法逃避的技术点,Go语言中,有许多优秀的 ORM(对象关系映射)库,用于简化数据库操作和数据持久化

GORM是Go 语言中最流行的 ORM 库之一,它提供了强大的查询功能、自动迁移、事务处理等功能。它支持多种数据库,如MySQL、PostgreSQL、SQLite 等

本文,介绍一下GORM连接数据库以及实现增删改查的过程

安装相关依赖和包

自己使用的是Windows系统,首先ctrl+R打开cmd,执行以下命令安装依赖:

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

或者

go get -u github.com/jinzhu/gorm
go get -u github.com/go-sql-driver/mysql

因为GORM框架只是简单封装了数据库的驱动包,在安装时仍需要下载原始的驱动包,上述命令就是实现了该过程

但是在自己实践过程中发现,命令会执行失败,提示信息如下:

image.png

发现是网络问题,原因是因为go包管理网址默认使用的是proxy.golang.org ,但在国内无法访问,因此需要更改一个国内代理地址,代码如下:

go env -w GOPROXY=https://goproxy.cn

添加后,命令即可成功执行:

image.png

在Go中使用

在下载好之后,尝试在项目中直接import相关包,but....

image.png

提示我们找不到对应包,这是为什么呢???

主要是因为我们的对应的包没有导入进来,把包导入进来即可

连接数据库

以MySQL为例,连接数据库的示例代码如下:

dsn := "user:password@tcp(localhost:3306)/dbname?parseTime=True"  
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})  
if err != nil {  
  panic("Failed to connect to database")  
}

下面我来详细解释一下,dsn是一个字符串,用于指定数据库连接的详细信息。

在本例子中

  • user:password是数据库的用户名和密码
  • tcp(localhost:3306):指定数据库服务器的地址和端口。localhost 表示数据库位于本地计算机,3306 是 MySQL 默认的端口号
  • /dbname:指定要连接的数据库的名称
  • parseTime=True:这是一个参数,告诉 GORM 在处理数据库时间字段时解析时间。如果不设置此参数,时间字段可能会以字符串形式返回

定义好字段之后,下一步便可以开始打开数据库连接了,使用gorm.Open 函数来打开数据库连接,其包含两个参数:

  • 第一个参数是数据库驱动程序,通过 mysql.Open(dsn) 来指定连接到 MySQL 数据库。
  • 第二个参数是一个 &gorm.Config{} 结构体,用于配置 GORM 的行为。在这里,采用默认配置即可

接下来,对可能发生的错误进行处理,使用 if err != nil 来检查数据库连接是否失败。如果连接失败,就会触发 panic,导致程序崩溃,并显示 "Failed to connect to database" 消息

定义模型

在使用 GORM 连接数据库时,通常需要定义 Go 结构体来表示数据库中的表格。每个结构体字段应该与数据库表格的列名和数据类型对应,同时还可以使用 struct tag 来指定其他配置项,如主键、外键、自动增量等。

例如,我现在有一个名字为“user”的用户表格,含有Email和Age字段,那么我可以定义一个简单的模型如下:

type User struct {  
  gorm.Model  
  // 列名、数据类型、唯一索引、非空约束 
  Username string `gorm:"column:username;type:varchar(255);unique_index;not null"` / 
  Email string `gorm:"column:email;type:varchar(255);unique_index;not null"`  
  Password string `gorm:"column:password;type:varchar(255);not null"`  
  Age int `gorm:"column:age;type:int"`  
}

为什么需要定义模型呢?

在GORM中,模型定义使得 GORM 能够根据结构体自动生成 SQL 查询语句,并且方便了数据库表格和 Go 代码之间的映射。设计原因是为了确保模型与数据库表格的结构保持一致,同时使用 struct tag 来指定约束和配置信息,以便 GORM 能够正确地操作数据库。

我感觉的话,是在代码中显式体现数据库的设计关系,更加便利,同时减少错误

增删改查

最后,我们使用GORM提供的方法执行数据库操作,如创建、读取、更新、删除记录等

代码如下:

newUser := User{Username: "BB", Email: "1779971738@qq.com"}  
db.Create(&newUser)

首先,创建了一个新的 User 结构体实例 newUser,对其进行初始化之后,使用 db.Create 方法将这个用户对象插入到数据库中。

var user User  
db.First(&user, 2)

首先,声明了一个 user 变量,用于存储查询到的用户对象。使用 db.First 方法,我们可以根据给定的条件(这里是 ID 为 2)从数据库中查找用户。查找到的结果会被填充到 user 变量中

db.Model(&user).Update("Username", "JJ")

使用 db.Model 方法,我们指定了要更新的模型对象,然后使用 Update 方法来更新其中的字段。在这里,我们将 UserName 字段从 "BB" 更新为 "JJ"

db.Delete(&user)

使用 db.Delete 方法删除了 user 对象表示的用户。这会从数据库中删除具有相同主键值的记录

结语

总体来看,使用GoRM来进行数据库开发还是非常便捷的,今天主要是Go语言的数据库操作,后续更新一般Java和Go连接数据库以及增删改查一些简单操作的对比

感觉Go之所以这么简单,主要是由于模型定义和自带方法,使得数据库交互更加方便