1 概述
GORM 是一个功能强大的 Golang ORM 框架,用于简化数据库操作。它支持多种数据库,包括 MySQL、PostgreSQL、SQLite 和 SQL Server,提供了丰富的功能如增删改查、事务管理、模型关联等。本文主要讲述GORM连接数据库,实现基本增删改查操作的代码流程。
2 连接并进行数据库操作
本文以连接MySQL为例,进行连接和基本增删改查功能的实现。
2.1 必要工作
首先导入两个必需的包:
import (
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
这两个包不是Go自带的默认包,需要在终端中下载。在项目模块中(go.mod文件所在的源文件夹)可以使用以下命令来安装:
go get -u gorm.io/gorm
go get -u gorm.io/driver/mysql
如果不在项目模块中,可以使用以下命令来安装:
go install gorm.io/driver/mysql@latest
go install gorm.io/gorm@latest
需要注意的是,Go默认的代理网址proxy.golang.org连接不稳定,国内开发者需要使用魔法才可以访问,推荐先通过以下指令更换为国内代理网址:
go env -w GOPROXY=https://goproxy.cn,direct
完成包的准备工作后,还需要根据目标数据库来定义一个结构体,用以进行数据存储和传递:
type dbname struct {
字段1 类型1
字段2 类型2
...
}
其中dbname为目标数据库的名称,结构体中的字段和类型则需要与数据库中的字段和类型一一对应。这里我们假设使用以下数据库结构:
type Product struct {
ID uint
Code string
Price uint
}
其中ID为整型的第一主键。
2.2 连接MySQL
MySQL连接代码如下所示:
db, err := gorm.Open(
mysql.Open("username:password@tcp(127.0.0.1:3306)/dbname?charset=utf8&parseTime=True&loc=Local"),
&gorm.Config{})
其中username为数据库用户的名称(一般默认为root),password为MySQL的连接密码,127.0.0.1:3306为MySQL的连接端口(此项为配置MySQL时的默认值,一般不用修改),dbname为所要连接的数据库的名称。以上值根据用户的实际情况自行修改。
为了判断数据库是否正确连接,可以添加以下代码进行判断:
if err != nil {
panic("failed to connect database")
}
2.3 插入操作
插入操作代码如下:
// 插入记录
db.Create(&dbname{字段1: 数据1, 字段2: 数据2, ...})
该代码插入成功后没有返回值。例如:在Product中插入以下记录:
// 插入ID为1、Code为D42、Price为100的一条记录
db.Create(&Product{ID: 1, Code: "D42", Price: 100})
2.4 查询操作
首先,声明一个结构体变量来存储返回的数据,这里假设声明了一个Product类型的结构体product:
var product Product
查询操作代码如下:
// 查询记录
db.First(&struct)
db.First(&struct, 数据1)
db.First(&struct, "字段1 = ?", 数据1)
db.First(&struct, "字段1 = ? AND 字段2 = ?", 数据1, 数据2)
代码解释如下:
db.First(&dbname):查询数据库中的第一条记录,并将数据存储在struct中(下同)。db.First(&struct, 数据1):查询主键字段对应的数据为数据1的记录。db.First(&struct, "字段1 = ?", 数据1):单字段查询。db.First(&struct, "字段1 = ? AND 字段2 = ?", 数据1, 数据2):多字段查询。
对应例子代码如下:
db.First(&product)
db.First(&product, 1)
db.First(&product, "Code = ?", "D42")
db.First(&product, "Code = ? AND Price = ?", "D42", 100)
2.5 修改操作
修改操作代码如下:
// 更新记录
db.Model(&struct).Where(条件).Update("字段1", 数据1) // 此处不需要加" = ?"
// 更新多个字段
db.Model(&struct).Where(条件).Updates(表名{字段1: 数据1, 字段2: 数据2}) // 仅更新非零值字段
db.Model(&struct).Where(条件).Updates(map[string]interface{}{字段1: 数据1, 字段2: 数据2})
注意:Where()可以有多种形式的写法,如下所示:
Where(数据):查询主键值等于数据的记录;Where("字段1", 数据1):查询字段1的值等于数据1的记录;Where("字段1 = ?", 数据1):同上。
对应例子代码如下:
db.Model(&product).Where(1).Update("Price", 100)
db.Model(&product).Where("ID", 1).Updates(Product{Price: 200, Code: "F42"})
db.Model(&product).Where("ID = ?", 1).Updates(map[string]interface{}{"Price": 100, "Code": "D42"})
2.6 删除操作
删除操作代码如下:
// 删除记录
db.Where(数据).Delete(&struct)
/*Where其他写法同上*/
与插入操作不同的是,删除操作有返回值,存储在声明的结构体对象中。
对应例子代码如下:
db.Where(1).Delete(&product) // 删除主键字段值为1的记录
3 总结
GORM连接数据库进行操作,主要通过关键字函数的递归调用来进行。相较于C#等语言连接数据库的操作而言,GORM代码更为简洁,语法逻辑也更符合SQL的语法习惯,使用体验非常优秀,是辅助开发者使用Go语言连接数据库的有力工具。