GORM连接数据库实现基本数据库操作 | 豆包MarsCode AI刷题

142 阅读4分钟

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()可以有多种形式的写法,如下所示:

  1. Where(数据):查询主键值等于数据的记录;
  2. Where("字段1", 数据1):查询字段1的值等于数据1的记录;
  3. 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语言连接数据库的有力工具。