GoZero框架接入数据库引擎Gorm 并实战:构建简单的 CRUD 业务API

GoZero 是一个高性能的微服务框架,它基于 Go 语言开发,提供了丰富的工具支持,能够帮助开发者快速构建可扩展、易维护的应用。Gorm 是 Go 语言中常用的 ORM 库,它帮助我们简化数据库操作,使用面向对象的方式进行增删改查操作。

本文将介绍如何在 GoZero 中接入 Gorm,并通过一个简单的实战案例来演示如何在 GoZero 框架中实现数据库的 CRUD(增删改查)操作。

### 1. 项目准备

首先,确保你的开发环境已经安装了 Go 语言和相关工具。你可以通过以下命令来检查 Go 的安装:

```bash

go version


```

然后,创建一个新的 Go 项目并进入项目目录:

```bash

mkdir gozero-gorm-demo
cd gozero-gorm-demo


```

### 2. 安装 GoZero 和 Gorm

使用 `go get` 安装 GoZero 和 Gorm。

```bash

go get github.com/tal-tech/go-zero
go get github.com/jinzhu/gorm
go get github.com/jinzhu/gorm/dialects/mysql


```

我们使用 MySQL 作为数据库,你可以根据自己的需要选择其他数据库(如 PostgreSQL 等)。安装完依赖后,我们就可以开始编写代码了。

### 3. 数据库模型设计

在这篇文章中,我们将构建一个简单的用户管理系统,包含对用户的 CRUD 操作。我们首先设计一个 `User` 模型,该模型包括 `ID`, `Name`, `Age`, 和 `Email` 字段。

#### 3.1 创建数据库表

首先,创建数据库和用户表:```sql

CREATE DATABASE gozero_demo;USE gozero_demo;CREATE TABLE users (id INT AUTO_INCREMENT PRIMARY KEY,name VARCHAR(100) NOT NULL,age INT NOT NULL,email VARCHAR(100) NOT NULL
);


```

### 4. 配置 Gorm 连接数据库

在项目中创建一个 `model` 包,专门处理数据库模型和 Gorm 的数据库操作。

#### 4.1 创建数据库连接

在 `model` 目录下创建一个 `db.go` 文件,负责初始化 Gorm 的数据库连接。```go

// model/db.go
package modelimport ("github.com/jinzhu/gorm"_ "github.com/jinzhu/gorm/dialects/mysql" // MySQL 驱动"log""time"
)var DB *gorm.DB// 初始化数据库连接
func InitDB() {var err errordsn := "root:root@tcp(127.0.0.1:3306)/gozero_demo?charset=utf8&parseTime=True&loc=Local"DB, err = gorm.Open("mysql", dsn)if err != nil {log.Fatalf("failed to connect to database: %v", err)}// 设置连接池等参数DB.DB().SetMaxIdleConns(10)DB.DB().SetMaxOpenConns(100)DB.DB().SetConnMaxLifetime(30 * time.Minute)DB.AutoMigrate(&User{}) // 自动迁移
}// 关闭数据库连接
func CloseDB() {err := DB.Close()if err != nil {log.Fatalf("failed to close database: %v", err)}
}


```

#### 4.2 创建 `User` 模型

在 `model` 目录下创建一个 `user.go` 文件,定义 `User` 结构体,并为其添加 Gorm 标签。```go

// model/user.go
package modelimport "github.com/jinzhu/gorm"// User 用户模型
type User struct {gorm.ModelName  string `gorm:"type:varchar(100);not null"`Age   int    `gorm:"not null"`Email string `gorm:"type:varchar(100);not null;unique"`
}// 创建用户
func CreateUser(user *User) (*User, error) {if err := DB.Create(user).Error; err != nil {return nil, err}return user, nil
}// 获取用户
func GetUserByID(id uint) (*User, error) {var user Userif err := DB.First(&user, id).Error; err != nil {return nil, err}return &user, nil
}// 获取所有用户
func GetAllUsers() ([]User, error) {var users []Userif err := DB.Find(&users).Error; err != nil {return nil, err}return users, nil
}// 更新用户
func UpdateUser(user *User) (*User, error) {if err := DB.Save(user).Error; err != nil {return nil, err}return user, nil
}// 删除用户
func DeleteUser(id uint) error {if err := DB.Delete(&User{}, id).Error; err != nil {return err}return nil
}


```

### 5. 接入 GoZero

接下来,我们在 GoZero 框架中创建 API 路由和处理逻辑,实现场景中的增删改查操作。

#### 5.1 定义 `user` API 结构体

在 `api` 目录下创建一个 `user.api` 文件,定义路由和请求方法。```txt

// api/user.api
type User struct {ID    uint   `json:"id"`Name  string `json:"name"`Age   int    `json:"age"`Email string `json:"email"`
}service user-api {@handler createUserpost /users@handler getUserget /users/{id}@handler getUsersget /users@handler updateUserput /users/{id}@handler deleteUserdelete /users/{id}
}


```

#### 5.2 生成 GoZero 代码

在项目根目录执行以下命令生成 GoZero 的代码框架:

```bash

go run github.com/tal-tech/go-zero/tools/goctl api go -api api/user.api -dir .


```

这会生成处理 API 请求的代码。GoZero 会为我们自动生成 handler 和 logic 等文件。

#### 5.3 实现 handler 和逻辑

在生成的 handler 目录下,我们实现具体的业务逻辑。

**handler/createUser.go**```go

// handler/createUser.go
package handlerimport ("context""gozero-gorm-demo/model""gozero-gorm-demo/rpc/user""github.com/tal-tech/go-zero/rest/httpx""net/http""strconv"
)func CreateUser(ctx context.Context, w http.ResponseWriter, r *http.Request) {var req user.Userif err := httpx.Parse(r, &req); err != nil {httpx.Error(w, err)return}user := &model.User{Name:  req.Name,Age:   req.Age,Email: req.Email,}createdUser, err := model.CreateUser(user)if err != nil {httpx.Error(w, err)return}httpx.OkJson(w, createdUser)
}
```**handler/getUser.go**```go
// handler/getUser.go
package handlerimport ("context""gozero-gorm-demo/model""github.com/tal-tech/go-zero/rest/httpx""net/http""strconv"
)func GetUser(ctx context.Context, w http.ResponseWriter, r *http.Request) {idStr := r.URL.Query().Get("id")id, err := strconv.Atoi(idStr)if err != nil {httpx.Error(w, err)return}user, err := model.GetUserByID(uint(id))if err != nil {httpx.Error(w, err)return}httpx.OkJson(w, user)
}


```

#### 5.4 启动服务

最后,在 `main.go` 文件中启动 GoZero 服务,并初始化数据库连接。```go

// main.go
package mainimport ("fmt""gozero-gorm-demo/model""gozero-gorm-demo/handler""github.com/tal-tech/go-zero/rest"
)func main() {model.InitDB()defer model.CloseDB()server := rest.MustNewServer(rest.RestConf{Port: 8080,})defer server.Stop()server.AddRoute(rest.Route{Method:  "POST",Path:    "/users",Handler: handler.CreateUser,})server.AddRoute(rest.Route{Method:  "GET",Path:    "/users/{id}",Handler: handler.GetUser,})fmt.Println("Starting server on port 8080...")server.Start()
}


```

### 6. 运行项目

确保数据库已启动,并且已正确创建用户表后,运行 GoZero 服务:

```bash

go run main.go


```

### 7. 测试 API

使用 Postman 或 curl 测试 API:

- **创建用户:**

```bash

curl -X POST -d '{"name": "Alice", "age": 25,

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/65149.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

KNN分类算法 HNUST【数据分析技术】(2025)

1.理论知识 KNN(K-Nearest Neighbor)算法是机器学习算法中最基础、最简单的算法之一。它既能用于分类,也能用于回归。KNN通过测量不同特征值之间的距离来进行分类。 KNN算法的思想: 对于任意n维输入向量,分别对应于特征…

达梦数据守护搭建

主备库初始化 ./dminit path/dmdata/data db_nameDM01 instance_nameDMSVR01 port_num5236 page_size16 extent_size32 log_size500 case_sensitive1 SYSDBA_PWDDM01SYSDBA ./dminit path/dmdata/data db_nameDM02 instance_nameDMSVR02 port_num5236 page_size16 extent_size3…

探索Flink动态CEP:杭州银行的实战案例

摘要:本文撰写自杭州银行大数据工程师唐占峰、欧阳武林老师。将介绍 Flink 动态 CEP的定义与核心概念、应用场景、并深入探讨其技术实现并介绍使用方式。主要分为以下几个内容: Flink动态CEP简介 Flink动态CEP的应用场景 Flink动态CEP的技术实现 Flin…

谷歌集群数据集:负载均衡云服务测试数据

谷歌集群数据集 以下为你举例说明各文件中一条数据的具体含义,方便你更好地理解这个数据集: 1. machine_events 文件示例 假设其中有这样一条数据:123456789, 101, 0, "platform_abc", 4, 8 含义:表示在时间戳为123456789微秒时,机器ID为101的这台机器发生了…

打造高效租赁小程序让交易更便捷

内容概要 在如今节奏飞快的商业世界里,租赁小程序如同一只聪明的小狐狸,迅速突围而出,成为商家与消费者之间的桥梁。它不仅简化了交易流程,还在某种程度上将传统租赁模式带入了互联网时代。越来越多的企业意识到,这种…

/proc /dev /sys 目录的用途

author: hjjdebug date: 2024年 12月 25日 星期三 16:32:44 CST description: /proc /dev /sys 目录的用途 文章目录 甲: /proc目录:对module 的管理:$cat /proc/devices 乙: /dev 目录创建设备节点命令 mknod 丙: /sys 目录1. /sys/dev2. /sys/devices3. /sys/module4. /sys/c…

来道面试题——CopyOnWriteArrayList

原理 初始化时候,CopyOnWriteArrayList内部维护了一个可变数组,用于存储元素当执行数据变更操作的时候,会先创建一个原数组的副本,在副本上进行写操作,修改副本中的元素。写操作完成之后,把原数组的引用指…

Nginx整合Lua脚本

Nginx-Lua Nginx整合Lua脚本 Lua环境搭建 下载地址 linux环境下 yum install lua安装后验证 lua -vLua脚本执行 lua xxx.luaNginx整合Lua nginx需要添加lua模块 嵌入内容 示例如下 修改nginx.conf如下 location /lua {default_type text/plain;content_by_lua ngx.sa…

【MinIO系列】MinIO Client (mc) 完全指南

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

Jmeter录制https请求

jmeter 5.5版本,chrome浏览器 1、首先添加Test Plan-Thread Group-HTTP(S) Test Script Recorder 2、设置HTTP(S) Test Script Recorder界面的Port(监听端口,设置浏览器代理时需要与这里保持一致)、HTPS Domains(录制…

安装Visual studio2022后,没法新建.net 4.5.2的项目

在Visual Studio 2022中无法新建.NET Framework 4.5.2的项目,通常是因为Visual Studio 2022默认不再支持较旧的.NET Framework版本,如4.5或4.5.2。不过,你可以通过一些手动步骤来使Visual Studio 2022支持.NET Framework 4.5.2项目。以下是一…

Nginx配置:如何在一个域名下运行两个网站

在现代的Web应用开发中,网站的数量和复杂性越来越高,多个网站使用同一个域名的情况也越来越常见。通过Nginx配置,我们可以轻松实现两个网站共用一个域名,并根据特定的路径、子域名或其他规则对流量进行分发。本文将详细介绍如何使…

前端最新Vue2+Vue3基础入门到实战项目全套教程,自学前端vue就选黑马程序员,一套全通关!

Vue 快速上手 Vue概念 Vue 是一个用于构建用户界面的渐进式框架 构建用户界面:基于数据渲染出用户看到的页面 渐进式:循序渐进 框架:一套完整的项目解决方案 Vue 的两种使用方式: ① Vue 核心包开发 场景:局部 模块改造 ② Vue 核心包 &am…

基于Spring Boot的高校请假管理系统

一、系统背景与意义 随着高校规模的扩大和学生数量的增加,传统的请假管理方式已经难以满足高校管理的需求。人工请假流程繁琐、耗时长,且容易出现信息错误或遗漏。因此,开发一套基于Spring Boot的高校请假管理系统具有重要意义,它…

Gate.io 平台通证 GT:持续赋能与销毁、财富效应显著

在瞬息万变的加密市场中,每一轮牛熊转换都在加速 CEX 市场的一轮又一轮洗牌,这也使得该赛道的格局始终处于动态的变化。而在本轮牛市中,CEX 赛道也正在从最初的三大领衔变成了多强角逐,而 Gate.io 作为创立 11 余年的老牌交易平台…

mysql怎么返回一个字段逗号分隔后的所有数据的sql

mysql怎么返回一个字段逗号分隔后的所有数据的sql 场景描述5.7版本MySql : 完整sql如下sql解析8.0 版本MySql : 完整sql如下 场景描述 mysql有一张表比如result表,表中有个字段场景id:scene_id,这个id存储的值可以是单个的id也可以是多个id用逗号拼接起来的,现在需…

RK3576 Android14编译OTA包提示java.lang.UnsupportedClassVersionError问题

最近遇到RK3576 Android14编译OTA包时,出现如下报错log: Error: A JNI error has occurred, please check your installation and try again Exception in thread "main" java.lang.UnsupportedClassVersionError: com/android/signapk/SignApk has been…

Spring Boot 中的 @Scheduled 定时任务以及开关控制

Scheduled注解是Spring框架(包括Spring Boot)中用于实现定时任务的一种方式。以下是对Scheduled注解的详细解析: 一、基本概念 Scheduled注解允许开发者在Spring容器中定义定时任务。通过简单地在一个方法上添加Scheduled注解,S…

WebRTC音视频同步原理与实现详解(下)

WebRTC音视频同步原理与实现详解(上) 第四章、音视频同步实现详解 4.1 音视频同步标准 音视频做到什么程度才算是同步呢? 关于音画同步, 业界有3个标准: 1)ITU-R BT.1359(1998)&#xff1a…

1.系统学习-线性回归

系统学习-线性回归 前言线性回归介绍误差函数梯度下降梯度下降示例 回归问题常见的评价函数1. MAE, mean absolutely error2. MSE, mean squared error3. R square (决定系数或R方) 机器学习建模流程模型正则化拓展阅读作业 链接: 2.系统学习-逻辑回归 …