Go-Zero 数据库实战:设置、建模与业务逻辑一体化

打印 上一主题 下一主题

主题 572|帖子 572|积分 1720

媒介

在之前的几篇文章中,我们深入学习了Go-Zero框架的实战应用,包括模板定制化、API定义、抽奖算法设计等内容。本文将继续探索Go-Zero框架的实践本领,并先容一些与数据库操作相干的主题。
在当代应用程序开发中,对数据库的操作是非常常见且紧张的一部门。Go-Zero框架提供了强盛的数据库支持,使得我们可以轻松地举行数据库访问和操作。本文将重点先容如何利用Go-Zero框架举行数据库的增删改查(CRUD)操作,并提供详细的示例代码和表明。
在本文中,我们将利用MySQL数据库作为示例,并结合Go-Zero框架的相干组件,如数据模型(Model)、事件处置惩罚、毗连池等,来展示数据库操作的最佳实践。无论你是初学者还是有肯定经验的开发者,本文都将为你提供有用的信息和本领,帮助你更好地理解和应用Go-Zero框架中的数据库操作。
在阅读本文之前,请确保你已经按照前几篇文章中的阐明举行了必要的预备工作,包括安装所需的工具和设置项目环境。同时,本文假设你已经具备肯定的数据库底子知识,如表的创建、数据的插入和查询等。
通过学习本文,你将把握以下内容:


  • 如何设置和初始化数据库毗连;
  • 如何利用Go-Zero框架的Model组件举行数据表的创建和映射;
  • 如何举行常见的CRUD操作,包括数据的插入、查询、更新和删除;
  • 如何处置惩罚数据库事件;
  • 实现用户注册业务逻辑。
我们鼓励你跟随示例代码,动手实践,并根据自己的需求举行定制和扩展。无论是为了学习Go-Zero的数据库操作,还是为了解决详细的业务问题,本文都将为你提供实用的指导和本领。
祝你阅读舒畅,并从中得到所需的知识和灵感!
实战前预备

本次实战我们是建立在(六)Go-Zero实战之docker开发环境摆设 底子之上,假如没有学习过,可以点击跳转学习,然后再看本文哦!
本次实战采用的是docker摆设,请提前预备好相干环境,关于docker环境的搭建在(六)Go-Zero实战之docker开发环境摆设 中也有讲解,不了解小伙伴建议先行实战docker环境搭建哦!
目录结构阐明




  • 在app下面我们将会新建一个服务comment,表示晒单评论服务,deploy/sql存放的是我们的建表语句,相干语句将会在接下来的讲解中给大家。
实战

设置docker组件



  • 在docker-commpose-env.yml中添加如下设置mysql

  1.   mysql:
  2.     image: mysql/mysql-server:8.0.28
  3.     container_name: mysql
  4.     environment:
  5.       # 时区上海 - Time zone Shanghai (Change if needed)
  6.       TZ: Asia/Shanghai
  7.       # root 密码 - root password
  8.       MYSQL_ROOT_PASSWORD: xxxxxx #这里填上mysql的密码
  9.     ports:
  10.       - 33069:3306
  11.     volumes:
  12.       # 数据挂载 - Data mounting
  13.       - ./data/mysql/data:/var/lib/mysql
  14.       # 日志
  15.     command:
  16.       # 将mysql8.0默认密码策略 修改为 原先 策略 (mysql8.0对其默认策略做了更改 会导致密码无法匹配)
  17.       # Modify the Mysql 8.0 default password strategy to the original strategy (MySQL8.0 to change its default strategy will cause the password to be unable to match)
  18.       --default-authentication-plugin=mysql_native_password
  19.       --character-set-server=utf8mb4
  20.       --collation-server=utf8mb4_general_ci
  21.       --explicit_defaults_for_timestamp=true
  22.       --lower_case_table_names=1
  23.     privileged: true
  24.     restart: always
  25.     networks:
  26.       - testProject_net
复制代码


  • 在本次实战中我们会利用到缓存(利用sqlc库),因此也举行了redis的设置。假如不想走缓存,可以利用sqlx库,后续根据需求再添加缓存。
  • 在docker-commpose-env.yml中添加如下设置redis

  1.   #redis容器 - Redis container
  2.   redis:
  3.     image: redis:6.2.5
  4.     container_name: redis
  5.     ports:
  6.       - 36379:6379
  7.     environment:
  8.       # 时区上海 - Time zone Shanghai (Change if needed)
  9.       TZ: Asia/Shanghai
  10.     volumes:
  11.       # 数据文件 - data files
  12.       - ./data/redis/data:/data:rw
  13.     command: "redis-server --requirepass G62m50oigInC30sf  --appendonly yes"
  14.     privileged: true
  15.     restart: always
  16.     networks:
  17.       - testProject_net
复制代码


  • 在举行复制粘贴的时候需要注意缩进哦!
重新启动项目所依靠的环境

  1. $ docker-compose -f docker-compose-env.yml up -d
复制代码

Navicate毗连数据库


Go-Zero操作数据库

go-zero提供了两个操作数据库的库,分别是sqlc和sqlx。区别是前者带缓存,后者不带缓存。

我们先在(六)Go-Zero实战之docker开发环境摆设 中创建的usercent服务举行gozero操作数据库相干内容的学习



  • tips:相干服务和表结构在(六)Go-Zero实战之docker开发环境摆设 中已经实现,假如当地没有的小伙伴可以先举行(六)的学习和操作哦!
  • 在(六)Go-Zero实战之docker开发环境摆设  中我们已经定义了两个RPC接口,接下来我们通过实现这两个register接口展示如何利用gozero操作数据库。
利用脚本生成数据库对应的model



  • tips:这一小节的内容在(三)Go-Zero和goctl:解锁微服务开发的神器,快速上手指南 中有过详细的讲解,假如有不清楚的小伙伴可以点击这里举行回顾哦!本节仅举行操作以及结果展示。
  • 脚本如下(放在目录的deploy/script/mysql/genModel.sh下):
  1. #!/usr/bin/env bash
  2. # 使用方法:
  3. # ./genModel.sh lottery lottery
  4. # ./genModel.sh lottery prize
  5. # ./genModel.sh looklook_usercenter user_contact
  6. # 再将./genModel下的文件剪切到对应服务的model目录里面,记得改package
  7. #生成的表名
  8. tables=$2
  9. #表生成的genmodel目录
  10. modeldir=./genModel
  11. # 数据库配置
  12. host=127.0.0.1
  13. port=33069
  14. dbname=$1
  15. username=root
  16. passwd=PXDN93VRKUm8TeE7
  17. template=../../goctl/1.6.1
  18. echo "开始创建库:$dbname 的表:$2"
  19. goctl model mysql datasource -url="${username}:${passwd}@tcp(${host}:${port})/${dbname}" -table="${tables}" -dir="${modeldir}" -cache=true --home="${template}" --style=goZero
复制代码


  • 利用GitBash打开deploy/script/mysql目录,实行脚本



  • 将相干代码放到model下



  • 把包名改成model



  • 设置文件中参加如下设置,用于jwt鉴权以及mysql、redis毗连设置的获取

  1. package config
  2. import (
  3.         "github.com/zeromicro/go-zero/core/stores/cache"
  4.         "github.com/zeromicro/go-zero/zrpc"
  5. )
  6. type Config struct {
  7.         zrpc.RpcServerConf
  8.         CheckinRpcConf zrpc.RpcClientConf
  9.         JwtAuth        struct {
  10.                 AccessSecret string
  11.                 AccessExpire int64
  12.         }
  13.         DB struct {
  14.                 DataSource string
  15.         }
  16.         Cache cache.CacheConf
  17. }
复制代码


  • svc下的serviceContext参加如下设置,用于获取mysql毗连

  1. package svc
  2. import (
  3.         "github.com/zeromicro/go-zero/core/stores/redis"
  4.         "github.com/zeromicro/go-zero/core/stores/sqlx"
  5.         "testProject/app/usercenter/cmd/rpc/internal/config"
  6.         "testProject/app/usercenter/model"
  7. )
  8. type ServiceContext struct {
  9.         Config    config.Config
  10.         UserModel model.UserModel
  11.         RedisClient *redis.Redis
  12. }
  13. func NewServiceContext(c config.Config) *ServiceContext {
  14.         sqlConn := sqlx.NewMysql(c.DB.DataSource)
  15.         return &ServiceContext{
  16.                 UserModel: model.NewUserModel(sqlConn, c.Cache),
  17.                 Config:    c,
  18.         }
  19. }
复制代码


  • rpc/etc/usercenter.yaml加上jwtAuth设置
  1. #jwtAuth
  2. JwtAuth:
  3.   AccessSecret: ae0536f9-6450-4606-8e13-5a19ed505da0
  4.   AccessExpire: 31536000
复制代码


  • 注册model

  1. UserModel:        model.NewUserModel(sqlConn, c.Cache),
复制代码


  • 如许我们就可以在userModel下写我们自己的sql操作了

事件操作



  • sqlc为我们提供了事件操作,相干源码如下:



  • 我们可以基于官方提供的TransactCtx方法,封装自己的事件处置惩罚方法

    • 起首在userModel里面注册Trans方法,如下图所示


  1. Trans(ctx context.Context, fn func(ctx context.Context, session sqlx.Session) error) error
复制代码


  • 接着写这个方法的实现,其实就是对原本的函数举行了一个封装。

  1. func (m *defaultUserModel) Trans(ctx context.Context, fn func(ctx context.Context, session sqlx.Session) error) error
  2. {    return m.TransactCtx(ctx, func(ctx context.Context, session sqlx.Session) error {       return fn(ctx, session)    })}
复制代码


  • 通过这个例子,我们可以知道gozero如何注册自己的数据库操作方法,以及了解到如何举行事件操作。
注册业务逻辑的实现



  • 起首我们先在tool下新增encryption.go文件,增长一个md5加密字符串的函数

  1. func Md5ByString(str string) string {
  2.         m := md5.New()
  3.         _, err := io.WriteString(m, str)
  4.         if err != nil {
  5.                 panic(err)
  6.         }
  7.         arr := m.Sum(nil)
  8.         return fmt.Sprintf("%x", arr)
  9. }
复制代码


  • 在logic/registerLogic.go里面编写我们的注册逻辑,注册业务代码如下
  1. func (l *RegisterLogic) Register(in *pb.RegisterReq) (*pb.RegisterResp, error) {
  2.     if err := l.svcCtx.UserModel.Trans(l.ctx, func(ctx context.Context, session sqlx.Session) error {
  3.        user := new(model.User)
  4.        if len(in.Password) > 0 {
  5.           user.Password = tool.Md5ByString(in.Password)
  6.        }
  7.        insertResult, err := l.svcCtx.UserModel.Insert(ctx, user)
  8.        if err != nil {
  9.           return errors.Wrapf(err, "Register db user Insert err:%v,user:%+v", err, user)
  10.        }
  11.        lastId, err := insertResult.LastInsertId()
  12.        if err != nil {
  13.           return errors.Wrapf(err, "Register db user insertResult.LastInsertId err:%v,user:%+v", err, user)
  14.        }
  15.        fmt.Println("lastId:", lastId)
  16.        return nil
  17.     }); err != nil {
  18.        logx.Error("Register:", err)
  19.        return nil, err
  20.     }
  21.     return &usercenter.RegisterResp{}, nil
  22. }
复制代码


  • tips:这个是最简单的插入一条数据的逻辑,实际生产中我们往往需要添加各种校验以及登录回调,jwt返回等,根据实际需求举行修改。假如读者朋侪有需求,后续文章我们也会美满这个注册逻辑。
  • 可以瞥见我们实际调用了Insert方法举行了插入操作。gozero框架的默认模板帮我们封装好了常规的增删改查操作,我们可以直接调用即可,假如有额外需求我们可以在userModel.go定义自己的sql查询方法,或者自定义我们自己的goctl,关于自定义模板可以看我前面的文章(四)Go-Zero自定义goctl实战:定制化模板,加速你的微服务开发效率哦!
  • 接下来我们简单看一下模板中对于增删查改方法的实现
  • 插入操作



  • 删除操作



  • 更新操作



  • 查询操作



  • 更多的数据库操作建议可以检察官方文档mysql 代码生成 | go-zero Documentation,本教程更注重于实践操作以及代码实现。
测试与验证



  • 编写完业务后我们启动服务,关于服务启动在(三)Go-Zero和goctl:解锁微服务开发的神器,快速上手指南 中有详细讲解,这里不举行重复讲解。





  • 可以瞥见成功举行了用户注册,阐明插入操作有用。
结语

至此,我们已经完成了数据库相干设置,以及通过用户服务和注册接口了解到了常规的增删改查操作。
关于更详细的实现,假如有小伙伴有需求,我们可以单独拿一节课来举行详细的拆分讲解。
本篇文章先容了Go-Zero中的数据库操作,并提供了常用的命令示例。通过学习和实践,我们可以更加纯熟地利用Go-Zero举行高效的数据库操作。在后续的文章中,我们将进一步探索数据库操作的高级用法和本领,为小伙伴们提供更多的参考。
欢迎关注 ❤

我的文章都首发在同名公众号:王中阳
需要简历优化或者就业辅导,可以直接加我微信:wangzhongyang1993,备注:知乎

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

王國慶

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表