go 进阶 go-zero相关: 九. goctl 生成数据库与缓存逻辑
【代码】go 进阶 go-zero相关: 八. goctl 生成数据库与缓存逻辑。
·
一. 基础
- go-zero内部提供了操作数据库,redis缓存的相关逻辑,可以通过goctl命令针对指定表生成对应的增删改查逻辑,参考博客, 参考博客,参考博客
- 例如将建表sql放到项目的sql文件夹下
- 切换到user项目路径下,执行goctl命令
goctl model mysql ddl -src="./sql/*.sql" -dir="./model" -style goZero
- 命令执行完毕后会生成对应数据库操作的文件
- 也可以给上面的命令增加"-c"表示生成带缓存逻辑的crud
生成代码缓存的代码:
goctl model mysql ddl -src="./sql/*.sql" -dir="./model" -c -style goZero
//或者直接连接数据库,指定表生成
goctl model mysql datasource -url="root:root@tcp(127.0.0.1:3306)/demo" -table="t_user" -dir="./model" -c -style goZero
- 项目的yaml中增加数据库连接与redis缓存连接配置
Etcd:
Hosts:
- 127.0.0.1:2379
Key: user.rpc
DB:
#拼接规则: 用户名:密码@tcp(ip:端口号)/库名?......
DataSource: root:root@tcp(localhost:3306)/demo?charset=utf8mb4&parseTime=true&loc=Asia%2FShanghai
Redis:
Host: localhost:6379
Type: node
Pass:
Cache:
- Host: localhost:6379 #缓存地址
Pass:
- internal/config下config增加DB与Cache属性
type Config struct {
rest.RestConf
zrpc.RpcClientConf
//数据库配置属性
DB struct {
DataSource string
}
//如果有缓存需求的话增加缓存配置属性
Cache cache.CacheConf
}
- 修改internal/svc/下ServiceContext,增加表model,在业务操作时直接通过指定model进行数据库的增删改查
import (
"github.com/zeromicro/go-zero/core/stores/sqlx"
"github.com/zeromicro/go-zero/zrpc"
"go_cloud_demo/rpc/types/user"
"go_cloud_demo/rpc/userclient"
"go_cloud_demo/user/internal/config"
"go_cloud_demo/user/model"
)
type ServiceContext struct {
Config config.Config
//用来创建rpc客户端的结构体
RpcUser userclient.User
//访问rpc服务接口返回的数据
UserAuthResp *user.UserAuthResp
//指定表操作model模型
TUserModel model.TUserModel
}
func NewServiceContext(c config.Config) *ServiceContext {
//获取数据库连接
sqlConn := sqlx.NewMysql(c.DB.DataSource)
return &ServiceContext{
Config: c,
//添加初始化rpc客户端逻辑
RpcUser: userclient.NewUser(zrpc.MustNewClient(
c.RpcClientConf,
)),
//设置指定表操作model模型
TUserModel: model.NewTUserModel(sqlConn, c.Cache),
//没生成缓存响应代码时使用: TUserModel: model.NewTUserModel(sqlConn),
}
}
- logic业务接口中增加数据库相关操作
func (l *UserLoginLogic) UserLogin(req *types.UserLoginReq) (resp *types.UserLoginResp, err error) {
user, err := l.svcCtx.TUserModel.FindOne(l.ctx, 11)
if nil != err {
fmt.Printf("====================query user err: %v", err)
return nil, err
}
logx.Info("query user by id user: %v", user)
//构建查询条件查询示例
//whereBuilder := l.svcCtx.TUserModel.RowBuilder().Where(squirrel.Eq{"user_id": ""})
//list, err := l.svcCtx.TUserModel.FindPageListByIdDESC(l.ctx, whereBuilder, req.LastId, req.PageSize)
return &types.UserLoginResp{
Message: user.UserName.String,
}, nil
}
go-zero 整合 Masterminds/squirrel
- go-zero默认提供的sqlx通过goctl可以生成简单的crud操作,如果像使用复杂sql,可以整合Masterminds/squirrel
- 执行go get命令拉取"github.com/Masterminds/squirrel"
二. go-zero 整合 GORM 实现数据库操作
三. go-zero DB缓存机制

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐
所有评论(0)