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维输入向量,分别对应于特征…

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

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

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

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

【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(录制…

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

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

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

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

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

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

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.系统学习-逻辑回归 …

Oracle 日常巡检

1. 检查服务器状态 1.1. CPU使用情况 1.1.1. top top 命令是 Linux 和 Unix 系统中用于显示实时系统状态的工具,特别是对于监控 CPU 和内存的使用非常有用。 在命令行中输入 top,top 会显示一个实时更新的界面,其中包含系统的关键指标&am…

熊军出席ACDU·中国行南京站,详解SQL管理之道

12月21日,2024 ACDU中国行在南京圆满收官,本次活动分为三个篇章——回顾历史、立足当下、展望未来,为线上线下与会观众呈现了一场跨越时空的技术盛宴,吸引了众多业内人士的关注。云和恩墨副总经理熊军出席此次活动并发表了主题演讲…

如何在网页端使用 IDE 高效地阅读 GitHub 源码?

如何在网页端使用 IDE 高效地阅读 GitHub 源码? 前言什么是 GitHub1s?使用 GitHub1s 阅读 browser-use 项目源码步骤 1: 打开 GitHub 项目页面步骤 2: 修改 URL 使用 GitHub1s步骤 3: 浏览文件结构步骤 4: 使用代码高亮和智能补全功能步骤 5: 快速跳转和…

3D布展平台主要有哪些功能?有什么特点?

3D布展平台是一种利用3D技术和虚拟现实(VR)技术,为用户提供线上虚拟展览和展示服务的平台。这些平台通常允许用户创建、设计和发布3D虚拟展厅,从而提供沉浸式的展览体验。以下是对3D布展平台的详细介绍: 一、主要功能 …

TowardsDataScience 博客中文翻译 2018~2024(一百二十三)

TowardsDataScience 博客中文翻译 2018~2024(一百二十三) 引言 从 2018 年到 2024 年,数据科学的进展超越了许多技术领域的速度。Towards Data Science 博客依然是这个领域的关键平台,记录了从基础工具到前沿技术的多方面发展。…

Docker Build 命令详解:在 Ubuntu 上构建 Docker 镜像教程

简介 Docker 通过提供轻量级、可移植和高效的解决方案,彻底改变了软件开发和部署。docker build 命令是 Docker 镜像创建过程的核心。本文将探讨 docker build 命令、其语法、用法以及优化 Docker 构建的最佳实践。本教程的目标是手把手教你如何在 Linux 服务器上使…

Springboot应用开发:配置类整理

目录 编写目的 一、线程池 1.1 setCorePoolSize 1.2 setMaxPoolSize 1.3 setQueueCapacity 1.4 setKeepAliveSeconds 1.5 setThreadNamePrefix 1.6 setRejectedExecutionHandler 1.7 示例代码 二、Durid数据库连接池 2.1 ServletRegistrationBean 2.2 FilterRegist…

【Spring】深入解析 Spring 原理:Bean 的多方面剖析(源码阅读)

🔥个人主页: 中草药 🔥专栏:【Java】登神长阶 史诗般的Java成神之路 一、Bean的作用域 在 Java Spring 框架中,Bean 的作用域是一个关键概念,它决定了 Bean 的生命周期和实例化方式,对应用的性…

Excel 列名称转换问题 Swift 解答

文章目录 摘要描述题解答案Swift 实现代码:题解代码分析示例测试及结果 时间复杂度空间复杂度总结未来展望参考资料 摘要 本篇文章将通过 Swift 编程语言解答一个常见的算法问题:给定一个整数 columnNumber,将其转换为 Excel 表中的列名称。…

基于艾伦方差的频率稳定性分析

某个授时系统通过串口或网口采集时间间隔计数器、频率计数器、相位噪声分析仪设备的重要信息,用于评估和分析频率源的频率稳定度,确保测量的准确性和可靠性。 数据处理: 读取保存在文件中的时间间隔计数器测量的时差数据,计算时间稳定度(用TDEV表示)并保存。TDEV包括秒稳…