【go-zero】(1):尝试使用go-zero的工具goctl进行model,controller代码生成,配置数据库,实现FindAll方法,查询数据库全部数据

这篇具有很好参考价值的文章主要介绍了【go-zero】(1):尝试使用go-zero的工具goctl进行model,controller代码生成,配置数据库,实现FindAll方法,查询数据库全部数据。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言


本文的原文连接是:
https://blog.csdn.net/freewebsys/article/details/128707849

未经博主允许不得转载。
博主CSDN地址是:https://blog.csdn.net/freewebsys
博主掘金地址是:https://juejin.cn/user/585379920479288
博主知乎地址是:https://www.zhihu.com/people/freewebsystem

1,关于go-zero框架


项目地址:
https://go-zero.dev/cn/
go-zero 是一个集成了各种工程实践的 web 和 rpc 框架

高性能
内建服务发现、负载均衡
内建限流
自适应熔断
自适应降载
自动触发,自动恢复
超时级联控制
自动缓存控制
链路跟踪、统计报警等
高并发支撑,稳定保障流量洪峰下的服务稳定

【go-zero】(1):尝试使用go-zero的工具goctl进行model,controller代码生成,配置数据库,实现FindAll方法,查询数据库全部数据

2,使用goctl 生成代码,安装工具


https://go-zero.dev/cn/docs/goctl/goctl

官方demo网站:

代码自动生成
go-zero 包含极简的 API 定义和生成工具 goctl,可以根据定义的 api 文件一键生成 Go, iOS, Android, Kotlin, Dart, TypeScript, JavaScript 代码,并可直接运行。

安装代码:

export GOPROXY=https://goproxy.cn/,direct 
go install github.com/zeromicro/go-zero/tools/goctl@latest

goctl -v
goctl version 1.4.3 darwin/amd64

先创建一个新项目:

goctl api new userDemo  -style goZero

cd userDemo

3,使用goctl 生成数据库model的crud代码


针对 userInfo 做CRUD,生成 model 代码:

比如一个用户表,放到 sql/user_info.sql 文件中:

CREATE TABLE IF NOT EXISTS  `user_info` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键Id',
  `name` varchar(200) NOT NULL COMMENT '用户名',
  `password` varchar(200) NOT NULL COMMENT '密码',
  `status` tinyint(1) NOT NULL COMMENT '状态',
  `type` tinyint(1) NOT NULL COMMENT '类型',
 
  PRIMARY KEY (`id`)
  
) ENGINE=InnoDB  AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT="用户信息表";

然后生成model 的 curd 代码:

注意 -c 参数表示是否带缓存:
生成不带缓存的代码:
goctl model mysql ddl -src="./sql/*.sql" -dir="./model"  -style goZero

生成代码缓存的代码:
goctl model mysql ddl -src="./sql/*.sql" -dir="./model" -c -style goZero

会有类似,不带缓存查询,直接硬编码了:

func (m *defaultUserInfoModel) FindOne(ctx context.Context, id int64) (*UserInfo, error) {
	query := fmt.Sprintf("select %s from %s where `id` = ? limit 1", userInfoRows, m.table)
	var resp UserInfo
	err := m.conn.QueryRowCtx(ctx, &resp, query, id)
	switch err {
	case nil:
		return &resp, nil
	case sqlc.ErrNotFound:
		return nil, ErrNotFound
	default:
		return nil, err
	}
}

带缓存查询:

func (m *defaultUserInfoModel) FindOne(ctx context.Context, id int64) (*UserInfo, error) {
	userInfoIdKey := fmt.Sprintf("%s%v", cacheUserInfoIdPrefix, id)
	var resp UserInfo
	err := m.QueryRowCtx(ctx, &resp, userInfoIdKey, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) error {
		query := fmt.Sprintf("select %s from %s where `id` = ? limit 1", userInfoRows, m.table)
		return conn.QueryRowCtx(ctx, v, query, id)
	})
	switch err {
	case nil:
		return &resp, nil
	case sqlc.ErrNotFound:
		return nil, ErrNotFound
	default:
		return nil, err
	}
}

4,使用goctl 生成controller代码


最关键的就是这个 userDemo.api 的文件定义,和其他框架不同,这个配置定义的是接口的API。

  * 可以在 servicecontext.go 里面传递依赖给 logic,比如 mysql, redis 等
  * 在 api 定义的 get/post/put/delete 等请求对应的 logic 里增加业务处理逻辑

定义 userDemo.api 的配置,做个 crud 的 api 接口:

type UserInfo {
	Id       int    `form:"id,optional"`
	Name     string `form:"name"`
	Password string `form:"password"`
	Status   int    `form:"status,optional"`
	Type     int    `form:"type,optional"`
}

type UserInfoResponse {
	Id     int    `form:"id"`
	Name   string `form:"name"`
	Status int    `form:"status"`
	Type   int    `form:"type"`
}

type SearchRequest {
	Name string `form:"name,optional"`
}

type IdRequest {
	Id int `form:"id"`
}

type CommonResponse {
	Status  int    `json:"status"`
	Message string `json:"message"`
}

type ListResponse {
	Status  int        `json:"status"`
	Message string     `json:"message"`
	Data    []UserInfo `json:"data"`
}

service userDemo-api {
	@handler userInfoListHandler
	get /userInfo/list(SearchRequest) returns (ListResponse)
	
	@handler viewUserInfoHandler
	get /userInfo/view(IdRequest) returns (UserInfoResponse)
	
	@handler saveUserInfoHandler
	post /userInfo/save(UserInfo) returns (CommonResponse)
	
	@handler deleteUserInfoHandler
	post /userInfo/delete(IdRequest) returns (CommonResponse)
}

重新生成代码:

# 需要把之前的 controller 和 logic 代码删除再生成。
goctl api go -api userDemo.api -dir . -style goZero

go mod init 
go mod tidy 

#然后再启动服务:
go run userdemo.go -f etc/userDemo-Api.yaml 

6,增加数据库,日志配置


然后修改 config 的配置和 yaml 配置:

Name: userDemo-api
Host: 0.0.0.0
Port: 8888

Redis:
  Host: localhost:6379
  Type: node
  Pass: 
DB:
  DataSource: go-demo:go-demo123@tcp(127.0.0.0:3306)/go_demo?charset=utf8mb4&parseTime=true&loc=Asia%2FShanghai
Cache:
  - Host: localhost:6379
    Pass: 

Log:
  ServiceName: userDemo-api
  Level: severe
  Mode: file

修改 config 类:

package config

import (
	"github.com/zeromicro/go-zero/core/logx"
	"github.com/zeromicro/go-zero/rest"
)

type Config struct {
	rest.RestConf
	logx.LogConf

	DB struct {
		DataSource string
	}

}

启动类里面增加日志:

	var c config.Config
	conf.MustLoad(*configFile, &c)

	// logx 根据配置初始化
	// https://go-zero.dev/cn/docs/blog/tool/logx/
	logx.MustSetup(c.LogConf)
	// grace close log
	proc.AddShutdownListener(func() {
		logx.Close()
	})

......

然后增加 findAll 方法:

func (m *defaultUserInfoModel) FindAll(ctx context.Context) ([]*UserInfo, error) {
	query := fmt.Sprintf("select %s from %s ", userInfoRows, m.table)

	var resp []*UserInfo
	err := m.conn.QueryRowsCtx(ctx, &resp, query)
	switch err {
	case nil:
		return resp, nil
	default:
		return nil, err
	}
}

controller 里面代码使用 copy 进行转换,因为 model 的类和 logic 包对应的类包不一样:

func (l *UserInfoListLogic) UserInfoList(req *types.SearchRequest) (resp *types.ListResponse, err error) {
	// todo: add your logic here and delete this line
	logx.WithContext(l.ctx).Info("######## query UserInfoList ########")

	userInfoList, err := l.svcCtx.UserInfoModel.FindAll(l.ctx)

	if err != nil {
		return nil, err
	}

	var userInfoListTmp []types.UserInfo //
	_ = copier.Copy(&userInfoListTmp, userInfoList)

	return &types.ListResponse{
		Status:  200,
		Message: "success",
		Data:    userInfoListTmp,
	}, nil
}

然后启动之后 controller 里面就可以获得数据了,终于调试好了。

然后访问:
http://localhost:8888/userInfo/list

{"status":200,"message":"success","data":[{"Id":1,"Name":"11","Password":"22","Status":1,"Type":1},{"Id":2,"Name":"33","Password":"44","Status":5,"Type":2},{"Id":3,"Name":"11","Password":"22","Status":1,"Type":1},{"Id":4,"Name":"33","Password":"44","Status":5,"Type":2},{"Id":5,"Name":"11","Password":"22","Status":1,"Type":1},{"Id":6,"Name":"33","Password":"44","Status":5,"Type":2}]}

7,总结


总体上感觉 go-zero 还是比较好上手的,使用起来也是非常的方便,但是 curd 的 model 里面的查询略少。
而且没有分页查询的数据,需要自己组装。把分页其他的啥的模板都修改下。
相比kratos 这个算是简单的了,因为kratos采用了ddd的设计方式,更优雅。
但是代码分布的略复杂,需要学习下,

本文的原文连接是:
https://blog.csdn.net/freewebsys/article/details/128707849

【go-zero】(1):尝试使用go-zero的工具goctl进行model,controller代码生成,配置数据库,实现FindAll方法,查询数据库全部数据文章来源地址https://www.toymoban.com/news/detail-423539.html

到了这里,关于【go-zero】(1):尝试使用go-zero的工具goctl进行model,controller代码生成,配置数据库,实现FindAll方法,查询数据库全部数据的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【go-zero】go-zero阿里云oss 前端上传文件到go-zero API服务 并在k8s pod中创建文件 并推送到阿里云oss 最佳实践

    问题:在本地通过上传文件,然后将文件推送到aliyun的oss中,是没问题的 但是部署到了k8s中,则出现了问题,一直报错没有创建的权限 思路:开始认为应该将该文件挂载到configmap中,然后通过这种方式修改了deployment和dockerfile。最终发现应该是go的创建文件路径方式搞错了,

    2024年02月13日
    浏览(48)
  • go-zero学习 第一章 基础

    因官网重新改版,本文是基于官网最新版本的文档并整合旧文档重新进行全面总结、归纳。 本文主要对官网 快速开始 进行提炼总结,未涉及部分将在后续章节陆续补充完善。 go-zero 的 goctl 工具下载 验证 goctl 的安装结果: goctl 一键安装 protoc 、 protoc-gen-go 、 protoc-gen-go-grp

    2024年02月09日
    浏览(50)
  • go-zero系列:接入Prometheus

    参考文档:https://zhuanlan.zhihu.com/p/463418864 https://prometheus.io/download/ 进入下载文件夹,比如prometheus-2.44.0.windows-amd64。 然后双击Prometheus.exe启动软件。 启动后,可以访问 http://127.0.0.1:9090/。就能查看Prometheus后台。 然后重启go-zero项目,能看到输出日志:Starting prometheus agent at 0.0.

    2024年02月16日
    浏览(40)
  • go-zero 开发之安装 etcd

    本文只涉及 Linux 上的安装。 二进制安装 下载二进制安装包 下载地址示例: 解压二进制安装包 删除二进制安装包 版本检查 启动 etcd 往 etcd 写读数据 Docker 安装 etcd 主要使用 Google 容器注册表(gcr.io)下的 gcr.io/etcd-development/etcd 仓库来存储其容器镜像。作为次要选项,它还使

    2024年02月04日
    浏览(44)
  • go-zero微服务实战——服务构建

    接上一节go-zero微服务实战——基本环境搭建。搭建好了微服务的基本环境,开始构建整个微服务体系了,将其他服务也搭建起来。 order的目录结构,如下 根目录 api服务 rpc服务 自定义逻辑层logic 自定义参数层models 自定义工具层util api服务和rpc服务都是基于goctl一键生成的,当

    2024年02月14日
    浏览(47)
  • go-zero的服务发现源码阅读

    服务发现原理与grpc源码解析_wangxiaoangg的博客-CSDN博客   go-zero rpc demo官方文档:rpc编写与调用 | go-zero 目录 一 服务注册 1. 创建rpc服务 2. 启动rpc服务 3. registerEtcd做了什么 4. discov.NewPublisher 服务发布者 二 服务发现 1.定义注册resolver 2.解析etcd地址创建链接 3.update方法 在看rp

    2024年02月06日
    浏览(62)
  • go-zero微服务实战——基本环境搭建

    项目架构来源于go-zero实战:让微服务Go起来。此对该项目有所删减,相对简单适合初学者。 省去了项目中每个服务占用独立docker的过程,省略了docker-compose的构建过程。每个服务是一个独立的程序不依赖与容器。 安装goctl 安装protoc 安装go-zero 生成api标准api服务 生成rpc服务 生

    2024年02月07日
    浏览(45)
  • go-zero 是如何做路由管理的?

    原文链接: go-zero 是如何做路由管理的? go-zero 是一个微服务框架,包含了 web 和 rpc 两大部分。 而对于 web 框架来说,路由管理是必不可少的一部分,那么本文就来探讨一下 go-zero 的路由管理是怎么做的,具体采用了哪种技术方案。 路由管理方案有很多种,具体应该如何选

    2024年02月13日
    浏览(34)
  • go-zero学习 第三章 微服务

    1.1 API服务模块 goctl 使用 api 文件生成 api服务 命令: 1.2 RPC服务模块 goctl 使用 protoc 文件生成 rpc服务 命令: 注意: --go_out 、 --go-grpc_out 、 --zrpc_out 三者配置的路径需要完全一致,否则会报下列错误。 基础代码:已生成基本的API服务、RPC服务。 这里以API服务调用RPC服务的登

    2024年02月16日
    浏览(73)
  • go-zero的rpc服务案例解析

    go-zero的远程调用服务是基于gRpc的gRPC教程与应用。 zero使用使用gRpc需要安装 protoc 插件,因为gRpc基于protoc插件使用protocol buffers文件生成rpc服务器和api的代码的。 gRPC 的代码生成还依赖 protoc-gen-go,protoc-gen-go-grpc 插件来配合生成 Go 语言的 gRPC 代码。 也可以使用go get命令安装

    2024年02月13日
    浏览(76)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包