当前位置: 首页 > news >正文

go-zero(三) 数据库操作

go-zero 数据库操作

在本篇文章中,我们将实现一个用户注册和登录的服务。我们将为此构建一个简单而高效的 API,包括请求参数和响应参数的定义。

一、Mysql连接

1. 创建数据库和表

在 MySQL 中创建名为 test_zero的数据库,并创建`user 表

CREATE TABLE `users` (`id` BIGINT NOT NULL AUTO_INCREMENT,`username` VARCHAR(50) NOT NULL COLLATE 'utf8_general_ci',`password` VARCHAR(255) NOT NULL COLLATE 'utf8_general_ci',`created_at` TIMESTAMP NULL DEFAULT (CURRENT_TIMESTAMP),PRIMARY KEY (`id`) USING BTREE,UNIQUE INDEX `username` (`username`) USING BTREE
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
;

可以看到username 字段被我设置了唯一性即UNIQUE ,这里先解释一下,使用goctl 生成model代码的时候,它会自动帮我们生成增删改查等方法。

如果字段设置了唯一性,它会自动生成通过这个字段查找数据的方法,后续我希望通过username去查询和修改用户数据,所以这里设置了一下。

2. 创建API文件

接下来我们根据这个表,创建user.api文件,

syntax = "v1"type (// 定义注册接口的 json 请求体RegisterRequest {//请求体定义了 Username 和Password 字段, 并且都设置了不能为空Username string `json:"username" validate:"required"`   Password string `json:"password" validate:"required"`}// 定义注册接口的 json 响应体RegisterResponse {//响应体 定义类一个Message  用来返回结果Message string `json:"message"`}
)type (// 定义登录接口的 json 请求体LoginRequest {Username string `json:"username" validate:"required"`Password string `json:"password" validate:"required"`}// 定义登录接口的 json 响应体LoginResponse {//正常的业务逻辑,用户登录后会产生一个token,用来记录登录信息Token string `json:"token"`}
)@server (group:  user //  生成代码时都会被放到 user 目录下prefix: /v1 //定义路由前缀为 "/v1"
)// 定义 HTTP 服务
// 微服务名称为 user-api,生成的代码目录和配置文件将和 user 值相关
service user-api {// 定义用户注册接口//定义 http.HandleFunc 转换的 go 文件名称及方法@handler RegisterHandler// 请求方法为 post// 路由为 /register // 请求体为 RegisterRequest// 响应体为 RegisterResponse,响应体必须有 returns 关键字修饰post /register (RegisterRequest) returns (RegisterResponse)//用户登录@handler LoginHandlerpost /login (LoginRequest) returns (LoginResponse)
}

这个 API 的结构可以通过注释清晰地理解。在下面这段代码中,我们可以看到请求参数和响应参数之间通过 returns 进行修饰:

post /register (RegisterRequest) returns (RegisterResponse)

需要注意的是,请求参数响应参数并不总是必需的。

例如,在更新数据时,我们可以省略响应体,只保留请求参数:

post /update (UpdateUserInfoReq)

同样,当我们通过 token 获取数据时,也可以省略请求体,而只定义响应参数:

get /getinfo returns (UserInfoResp)

这样的灵活性使得 API 定义更加简洁明了。

3. 生成服务代码和model代码

我们创建一个新的项目,目录设置为user ,使用goctl通过user.api生成项目代码:

goctl api go --api user.api --dir ./

下面我们就演示怎么使用goclt 以及sql生成model , 在刚刚生成的项目中,在internal目录下创建一个modle的文件夹,然后再这个文件夹下面创建user.sql,把之前的sql语句粘贴进来,然后使用命令:

 goctl model mysql ddl --src user.sql --dir ./

当你看到 Done. 输出则代表生成成功了,帮我们生成了下面3个文件。

$ tree
.
├── usermodel.go
├── usermodel_gen.go
└── vars.go
  • usermodel.go: 定义数据库表的模型及其业务逻辑。
  • usermodel_gen.go: 自动生成的代码,包含数据库操作的实现。
  • vars.go: 全局变量和配置的定义,供各个模块使用。

4.查看model代码

现在我们来具体看下goctl帮我们生成的model代码,我们先看下usersmodel.go文件,

它帮我们定义了NewUsersModel 用来返回user表模型

// NewUsersModel returns a model for the database table.
//NewUsersModel 返回数据库表的模型
func NewUsersModel(conn sqlx.SqlConn) UsersModel {return &customUsersModel{defaultUsersModel: newUsersModel(conn),}
}

接着看下usersmodel_gen.go文件:

帮我们根据数据库自动生成了数据模型

 Users struct {Id        int64     `db:"id"`Username  string    `db:"username"`Password  string    `db:"password"`CreatedAt time.Time `db:"created_at"`}

给usersModel定义了基本的增删改查的接口

usersModel interface {Insert(ctx context.Context, data *Users) (sql.Result, error)FindOne(ctx context.Context, id int64) (*Users, error)FindOneByUsername(ctx context.Context, username string) (*Users, error)Update(ctx context.Context, data *Users) errorDelete(ctx context.Context, id int64) error
}

5.链接数据库

go-zero 提供了一个强大的 sqlx 工具,用于操作数据库。 所有 SQL 相关操作的包在 github.com/zeromicro/go-zero/core/stores/sqlx

在使用 go-zero 框架与数据库交互时,通常会遵循一系列的步骤和逻辑,下面是调用数据库的典型顺序和逻辑:

增加数据库连接配置

打开 etc\user-api.yaml文件,增加 MySQL 连接字符串:

#定义了一个名为MysqlDB的结构体,并有一个名为DbSource的字符串。
MysqlDB:# 字符串请根据实际配置环境更改DbSource: "root:root@tcp(127.0.0.1:3306)/test_zero"	

设置结构体,用来解析配置文件

现在我们需要把这个MysqlDB这个字段映射到 go-zero的结构体中,打开internal/config/config.go 文件,把代码修改为以下:

type Config struct {rest.RestConfMysqlDb struct{DbSource string `json:"DbSource"`}
}

我们之前提到过,Config 结构体中的字段与 YAML 文件中的字段可以不区分大小写,但必须保持一致,否则会导致解析错误。如果希望使用不同的名称,可以通过 json: 标签指定 YAML 文件中对应的字段名。

把数据库连接注册到服务上下文

go-zero提供了一个快捷的方式可以创建 Mysql 链接,接着我们就可以使用这个连接进行各种数据库操作:

func NewMysql(datasource string, opts ...SqlOption) SqlConn

我们先使用sqlx.NewMysql(c.MysqlDb.DbSource) 创建数据库连接,然后传给NewUsersModel,初始化UserModel,打开internal/svc/servicecontext.go文件,把代码修改为:

//ServiceContext 结构体用户封装服务的上下文信息,相当环境初始化type ServiceContext struct {Config config.Config  //UserModel: 类型为 model.UsersModel,表示与用户相关的数据库模型//用于处理与用户相关的数据操作(如用户的创建、读取、更新和删除等)UserModel model.UsersModel     
}
//NewServiceContext 是ServiceContext 的构造函数
//它接收配置参数并初始化 ServiceContext,确保服务可以访问所需的配置和数据模型
func NewServiceContext(c config.Config) *ServiceContext {return &ServiceContext{Config: c,  //把配置信息注册到服务上下文//通过调用 model.NewUsersModel 函数对UserModel 进行初始化//sqlx.NewMysql 是数据库连接,链接字符串为config中的MysqlDb.DbSourceUserModel:   model.NewUsersModel(sqlx.NewMysql(c.MysqlDb.DbSource)),}
}

sqlx.NewMysql 是 sqlx 包中的一个函数,通常用于创建一个新的 MySQL 数据库连接,我们可以看下它在go-zero中的代码, 就是传入datasource 字符串,然后返回SqlConn 数据库连接

func NewMysql(datasource string, opts ...SqlOption) SqlConn {opts = append([]SqlOption{withMysqlAcceptable()}, opts...)return NewSqlConn(mysqlDriverName, datasource, opts...)
}

二、CURD演示

1. 实现注册服务(查、赠)

现在我们开始实现注册逻辑
打开internal/logic/user/registerlogic.go文件,修改代码如下:

func (l *RegisterLogic) Register(req *types.RegisterRequest) (resp *types.RegisterResponse, err error) {// todo: add your logic here and delete this lineuserModel := l.svcCtx.UserModel  //从服务上下文获取UserModel //调用FindOneByUsername查询用户数据,判断用户是否已经注册//req.Username 从请求信息中获取 Usernameuser, _ := userModel.FindOneByUsername(l.ctx, req.Username)//如果username不为空说明已经注册if user != nil {//已经存在用户return nil, err}//插入新的数据_, err = userModel.Insert(l.ctx, &model.Users{Username:  req.Username,Password:  req.Password,CreatedAt: time.Now(),})if err != nil {//	注册失败return nil, err}//返回响应信息return &types.RegisterResponse{Message: "注册成功",}, nil
}

我们先运行程序,测试一下

在这里插入图片描述

2.实现登录服务 (查)

现在我们开始实现=登录逻辑
打开internal/logic/user/loginlogic.go文件,修改代码如下:

func (l *LoginLogic) Login(req *types.LoginRequest) (resp *types.LoginResponse, err error) {// todo: add your logic here and delete this line//因为我们目前还没涉及到jwt鉴权,所以先把token当面message使用userModel := l.svcCtx.UserModeluser, _ := userModel.FindOneByUsername(l.ctx, req.Username)//查询username判断是否有数据if user != nil { //如果有数据,密码是否和数据库匹配if req.Password == user.Password {return &types.LoginResponse{Token: "登录成功",}, nil} else {return &types.LoginResponse{Token: "密码错误",}, nil}} else {return &types.LoginResponse{Token: "用户未注册",}, nil}}

运行项目

相关文章:

go-zero(三) 数据库操作

go-zero 数据库操作 在本篇文章中,我们将实现一个用户注册和登录的服务。我们将为此构建一个简单而高效的 API,包括请求参数和响应参数的定义。 一、Mysql连接 1. 创建数据库和表 在 MySQL 中创建名为 test_zero的数据库,并创建user 表 …...

SQL面试题——间隔连续问题

间隔连续问题 某游戏公司记录的用户每日登录数据如下 +----+----------+ | id| date| +----+----------+ |1001|2021-12-12| |1001|2021-12-13| |1001|2021-12-14| |1001|2021-12-16| |1001|2021-12-19| |1001|2021-12-20| |1002|2021-12-12| |1002|2021-12-16| |1002|…...

vim配置 --> 在创建的普通用户下

在目录/etc/ 下面,有个名为vimrc 的文件,这是系统中公共的vim配置文件对所有用户都有效 我们现在创建一个普通用户 dm 创建好以后,我们退出重新链接 再切换到普通用户下 再输入密码(是不显示的,输入完后,…...

(计算机毕设)基于SpringBoot+Vue的房屋租赁系统的设计与实现

博主可接毕设设计!!! 各种毕业设计源码只要是你有的题目我这里都有源码 摘 要 社会的发展和科学技术的进步,互联网技术越来越受欢迎。网络计算机的生活方式逐渐受到广大人民群众的喜爱,也逐渐进入了每个用户的使用。互…...

【含开题报告+文档+PPT+源码】基于SpringBoot的医院药房管理系统

开题报告 在科技迅速发展的今天,各行各业都在积极寻求与现代技术的融合,以提升自身的运营效率和竞争力。医疗行业作为关乎国计民生的关键领域,其信息化建设的步伐尤为迅速。医院药房作为医疗体系中的核心环节,其管理效率和服务质…...

基于SpringBoot的“数码论坛系统设计与实现”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“数码论坛系统设计与实现”的设计与实现(源码数据库文档PPT) 开发语言:Java 数据库:MySQL 技术:SpringBoot 工具:IDEA/Ecilpse、Navicat、Maven 系统展示 系统总体结构图 系统首页界面图 数码板…...

Linux-第2集-打包压缩 zip、tar WindowsLinux互传

欢迎来到Linux第2集,这一集我会非常详细的说明如何在Linux上进行打包压缩操作,以及解压解包 还有最最重要的压缩包的网络传输 毕竟打包压缩不是目的,把文件最终传到指定位置才是目的 由于打包压缩分开讲没有意义,并且它们俩本来…...

项目进度计划表:详细的甘特图的制作步骤

甘特图(Gantt chart),又称为横道图、条状图(Bar chart),是一种用于管理时间和任务活动的工具。 甘特图由亨利劳伦斯甘特(Henry Laurence Gantt)发明,是一种通过条状图来…...

Cargo Rust 的包管理器

Cargo->Rust 的包管理器 Cargi简介Cargo 的主要功能1. 创建项目2. 管理依赖3. 构建项目4. 运行项目5. 测试代码6. 检查代码7. 生成文档8. 发布和分享包 Cargo 的核心文件1. Cargo.toml2. Cargo.lock **Cargo 的生态系统** 常用命令总结Hello, Cargo! 示例 Cargi简介 Cargo …...

【Rust 编程语言工具】rustup-init.exe 安装与使用指南

rustup-init.exe 是用于安装和管理 Rust 编程语言工具链的 Windows 可执行文件。Rust 是一种系统级编程语言,旨在提供安全、并发和高性能的功能。rustup-init.exe 是官方提供的安装器,用于将 Rust 安装到 Windows 操作系统中,并配置相关环境。…...

集群聊天服务器(12)nginx负载均衡器

目录 负载均衡器nginx负载均衡器优势 如何解决集群聊天服务器跨服务器通信问题?nginx的TCP负载均衡配置nginx配置 负载均衡器 目前最多只能支持2w台客户机进行同时聊天 所以要引入集群,多服务器。 但是客户连哪一台服务器呢?客户并不知道哪一…...

数据挖掘英语及概念

分类 classify 上涨或跌 回归 regression 描述具体数值 分类模型评估 1.混淆(误差)矩阵 confusion matrix 2.ROC曲线 receiver operating characteristic curve 接收者操作特征曲线 3.AUC面积 area under curve ROC曲线下与坐标轴围成的面积&#x…...

springboot第82集:消息队列kafka,kafka-map

官网下载链接:https://kafka.[apache].org/downloads 我下载的是[Scala]2.12 - kafka_2.12-3.1.0.tgz kafka只需要解压下载的压缩包就行了,我这里解压的路径是D:\kafka_2.12-3.1.0,kafka的运行需要依赖zookeeper,当前版本已经内置…...

sql server查看当前正在执行的sql

#统计某类sql执行次数,并按总体cpu消耗时间降序排序 with a as ( select er.session_id,db_name(er.database_id) as DBNAME,sy.last_batch AS 最后执行时间, er.cpu_time ,er.total_elapsed_time/1000 as sum_elapsed_time_s, CAST(csql.text AS varchar(8000)) A…...

STM32设计学生宿舍监测控制系统-分享

目录 前言 一、本设计主要实现哪些很“开门”功能? 二、电路设计原理图 电路图采用Altium Designer进行设计: 三、实物设计图 四、程序源代码设计 五、获取资料内容 前言 本项目旨在利用STM32单片机为核心,结合传感器技术、无线通信技…...

HAproxy 详解

一、基本概念 1.1 什么是 HAproxy? HAproxy(High Availability Proxy)是一个开源的高性能负载均衡器和反向代理服务器,它主要用于在网络上分发流量,以提高网站或应用程序的可用性和性能。HAproxy 可以处理大量的并发…...

间接采购管理:主要挑战与实战策略

间接采购支出会悄然消耗掉企业的现金流,即使是管理完善的公司也难以避免。这是因为间接支出不直接关联特定客户、产品或项目,使采购人员难以跟踪。但正确管理间接支出能为企业带来显著收益——前提是要有合适的工具。本文将分享管理间接支出的关键信息与…...

2411rust,正与整128

原文 长期以来,Rust在x86-32和x86-64架构上128位整数的对齐与C语言不一致.最近已解决此问题,但该修复带来了一些值得注意的效果. 作为用户,除非如下,否则不用担心: 1,假设i128/u128对齐,而不是用align_of 2,忽略improper_ctypes*检查,并在FFI中使用这些类. 除x86-32和x86-64…...

将 HTML 转换为 JSX:JSX 和 JSX 规则

JSX 是 JavaScript 的语法扩展。您可以在 JavaScript 文件中编写 HTML 格式。 它基于 Web、Html、Css 和 JavaScript。Web 开发人员将页面内容分别编写为 Html 文件,将设计编写为 Css 文件,将逻辑编写为 JavaScript 文件。 须知 : JSX 是一个…...

将 FastAPI 部署到生产服务器(一套 全)

将 FastAPI 部署到生产服务器(全) 文章目录 将 FastAPI 部署到生产服务器(全)一、前言二、Fastapi项目 生产环境配置1. 准备环境2. 编写 FastAPI 应用3. 使用 Uvicorn 运行应用4. 配置生产级服务器 Gunicorn4.1 配置 Gunicorn 和 …...

题解 洛谷 Luogu P1873 [COCI 2011/2012 #5] EKO / 砍树 二分答案 C/C++

题目传送门: P1873 [COCI 2011/2012 #5] EKO / 砍树 - 洛谷 | 计算机科学教育新生态https://www.luogu.com.cn/problem/P1873思路: 很简单的二分答案 每次找区间中点 m,判断以 m 为高度砍下的木头是否够 h 即可 代码: #defin…...

SpringCloud SaToken整合微服务 集成Redis 网关路由权限拦截 服务间内部调用鉴权

介绍 作为 API 网关,通常负责路由、负载均衡、安全控制等功能。进行 统一鉴权 的做法意味着将所有微服务的认证和授权逻辑集中到网关层,而不是每个微服务单独实现。这样做有许多好处,微服务只关心核心业务逻辑,不需要处理身份验证…...

Oracle ADB 导入 BANK_GRAPH 的学习数据

Oracle ADB 导入 BANK_GRAPH 的学习数据 1. 下载数据2. 导入数据运行 setconstraints.sql 1. 下载数据 访问 https://github.com/oracle-quickstart/oci-arch-graph/tree/main/terraform/scripts,下载, bank_accounts.csvbank_txns.csvsetconstraints.…...

优化 MFC CGridCtrl 的表格布局与功能

在使用 MFC 的 CGridCtrl 控件创建表格时,遇到的一个典型问题是,当表格滚动条出现时,最后一列会显示空白。这篇博客将记录解决这一问题的详细过程,同时总结了 CGridCtrl 初始化及优化的关键步骤,帮助开发者快速搭建一个…...

koa-body 的详细使用文档

目录 koa-body install Features Hello World - Quickstart Usage with koa-router Usage with unsupported text body type Options 关于 parsedMethods 的说明 文件支持 关于未解析请求主体的说明 一些强大的选择 使用总结 koa-body 功能齐全的 koa body 解析器中…...

信息系统与互联网中的安全、隐私及伦理问题

1 伦理(Ethics) 1.1 伦理框架(Ethical Frameworks) 自然法与权利(Natural Law and Rights) 定义:基于人类自然权利的伦理思想,强调生命、自由和财产等基本权利。应用:隐…...

Java安全—log4j日志FastJson序列化JNDI注入

前言 log4j和fastjson都是这几年比较火的组件,前者是用于日志输出后者则是用于数据转换,今天我们从源码来说一下这两个组件为何会造成漏洞。 实验环境 这里的idea要进行一下配置,因为我们要引用第三方组件,而这些第三方组件都是…...

【STM32开发笔记】移植AI框架TensorFlow到STM32单片机【DSP指令加速篇】

【STM32开发笔记】移植AI框架TensorFlow到STM32单片机【DSP指令加速篇】 一、前文回顾二、CMSIS-NN简介2.1 为什么介绍CMSIS-NN?2.2 CMSIS-NN是什么?2.3 CMSIS-NN核心特性2.4 CMSIS-NN算子支持 三、TFLMCMSIS-NN集成3.1 包含TFLM的STM32项目3.2 理解TFLM…...

Python中如何判断一串文本是不是数字

目录 1. 内置函数2. 尝试类型转换3. 正则表达式 在编程中,我们经常需要确定一段文本是否为数字。 这不仅关系到数据的准确性,还涉及到后续的计算和处理。 1. 内置函数 在Python中,可以使用str.isdigit()、str.isnumeric()和str.isdecimal()…...

基于YOLOv8深度学习的智慧农业山羊行为检测系统研究与实现(PyQt5界面+数据集+训练代码)

随着智慧农业的快速发展,利用先进的技术手段对牲畜的行为进行自动化监测和管理,已经成为现代农业中的重要研究方向之一。在传统的农业管理模式中,牲畜的行为监测通常依赖于人工观测,耗时耗力且难以实现大规模实时监控。然而&#…...

做网站要给ftp密码吗/开鲁seo服务

2019独角兽企业重金招聘Python工程师标准>>> 项目上对图像处理需要用到点高斯算法,网上找到一篇对原理及部分问题分析讲解的还不错的文章,分享一下,后付自己的一段代码 - 理论 - 高斯分布函数可表示为一个一维的函数G(x) 或者一个…...

家在深圳坪山业主论坛/网络seo软件

零、前言 最近几天,真的是和迭代器干上了....... 这篇博客,通过简单实现vector中的迭代器,了解迭代器的机制 一、迭代器的设计思想: 为什么要有迭代器? 答:迭代器模式(Iterator &#xff0…...

可以做网站高仿服装吗/重庆广告公司

不限(学硕)(0101)哲学(学硕)(0201)理论经济学(学硕)(0202)应用经济学(专硕)(0251)金融硕士(专硕)(0252)应用统计硕士(专硕)(0253)税务硕士(专硕)(0254)国际商务硕士(专硕)(0255)保险硕士(专硕)(0256)资产评估硕士(专硕)(0257)审计硕士(学硕)(0270)统计学(学硕)(0301)法学(学硕)…...

广告设计公司网/seo软文是什么

Openmeetings 当前作为Apache下的一个项目,基于JAVA开发,主要用于提供视频会议、即时通讯、白板、协作文档等群件工具,通过使用Red 5流媒体服务器处理媒体流。 Openmeetings的主要功能和特性: 音频、视频会议 会议前可选择音频、视频、音…...

为wordpress安装iis rewrite 组件与配置方法/网络营销师主要做什么

访问apache官网 网址:https://tomcat.apache.org 在官网找到projects,进入 找到tomcat8,进入 点击zip下载,打开文件夹 解压到你想保存的文件夹,记住路径 在Tomcat文件夹中: bin:可执行文件 startup.bat…...

收录批量查询/seo网站关键词优化软件

1、温度转换 while True:a int(input("摄氏度转换为华氏度请按1\n华氏度转换为摄氏度请按2\n"))if a 1:celsius float(input("请输入摄氏度:"))# 计算华氏温度fahrenheit (celsius 1.8) 32 # f c9/532print({:.2f}摄氏度转换为华氏度为…...