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

go-kratos 学习笔记(6) 数据库gorm使用

数据库是项目的核心,数据库的链接数据是data层的操作,选择了比较简单好用的gorm作为数据库的工具;之前是PHP开发,各种框架都是orm的操作;gorm还是很相似的,使用起来比较顺手

go-kratos官网的实例是ent,功能是很强大,操作稍微复杂点

gorm的官方文档 https://gorm.io/zh_CN/docs/index.html

使用
go get -u gorm.io/gorm
go get -u gorm.io/driver/mysql

照葫芦画瓢先画起来再说

data.go 把数据库的链接放到NewData方法里面

package dataimport ("gorm.io/driver/mysql""gorm.io/gorm""xgs_kratos/gen/config/users""github.com/go-kratos/kratos/v2/log""github.com/google/wire"
)// ProviderSet is data providers.
var ProviderSet = wire.NewSet(NewData, NewUserRepo, CreateRegister)// Data .
type Data struct {// TODO wrapped database clientdb  *gorm.DBlog *log.Helper
}// NewData .
func NewData(c *conf.Data, logger log.Logger) (*Data, func(), error) {cleanup := func() {log.NewHelper(logger).Info("closing the data resources")}db, err := gorm.Open(mysql.Open(c.Database.Source), &gorm.Config{})if err != nil {log.Fatalf("failed to connect database: %v", err)panic(err)}return &Data{db:  db,log: log.NewHelper(logger),}, cleanup, nil
}

user.proto加2个http的方法  ListUser 和 CreateUser

syntax = "proto3";package gen.users;
import "google/api/annotations.proto";option go_package = "xgs_kratos/gen/users;users";
option java_multiple_files = true;
option java_package = "api.users";service User {rpc CreateUser (CreateUserRequest) returns (CreateUserReply){option (google.api.http) = {post: "/CreateUser",body: "*",};};rpc UpdateUser (UpdateUserRequest) returns (UpdateUserReply);rpc DeleteUser (DeleteUserRequest) returns (DeleteUserReply);rpc GetUser (GetUserRequest) returns (GetUserReply);rpc ListUser (ListUserRequest) returns (ListUserReply){option (google.api.http) = {get: "/ListUser",};};
}message CreateUserRequest {string name = 1;string email = 2;int32 age = 3;
}
message CreateUserReply {int64 id = 1;
}message UpdateUserRequest {}
message UpdateUserReply {}message DeleteUserRequest {}
message DeleteUserReply {}message GetUserRequest {}
message GetUserReply {}message ListUserRequest {}
message UserData {int64 id = 1;string name = 2;string email = 3;int32 age = 4;
}
message ListUserReply {repeated UserData users = 1;
}

需要再biz业务层和data数据层 实现

service/user.go

package serviceimport ("context""xgs_kratos/app/users/internal/biz"pb "xgs_kratos/gen/users"
)type UserService struct {pb.UnimplementedUserServeruc *biz.UserUsecase
}func NewUserService(uc *biz.UserUsecase) *UserService {return &UserService{uc: uc,}
}func (s *UserService) CreateUser(ctx context.Context, req *pb.CreateUserRequest) (*pb.CreateUserReply, error) {user, err := s.uc.CreateUser(ctx, req)if err != nil {return nil, err}return user, nil
}//	func (s *UserService) UpdateUser(ctx context.Context, req *pb.UpdateUserRequest) (*pb.UpdateUserReply, error) {
//		return &pb.UpdateUserReply{}, nil
//	}
//
//	func (s *UserService) DeleteUser(ctx context.Context, req *pb.DeleteUserRequest) (*pb.DeleteUserReply, error) {
//		return &pb.DeleteUserReply{}, nil
//	}
//
//	func (s *UserService) GetUser(ctx context.Context, req *pb.GetUserRequest) (*pb.GetUserReply, error) {
//		return &pb.GetUserReply{}, nil
//	}
func (s *UserService) ListUser(ctx context.Context, req *pb.ListUserRequest) (*pb.ListUserReply, error) {user, err := s.uc.ListUser(ctx, req)if err != nil {return nil, err}return &pb.ListUserReply{Users: user,}, nil
}

biz/user.go

package bizimport ("context""github.com/go-kratos/kratos/v2/log""xgs_kratos/gen/users"
)type User struct {
}// UserRepo 定义数据仓库接口
type UserRepo interface {CreateUser(ctx context.Context, req *users.CreateUserRequest) (*users.CreateUserReply, error)ListUser(ctx context.Context, req *users.ListUserRequest) ([]*users.UserData, error)
}// UserUsecase 定义业务逻辑
type UserUsecase struct {repo UserRepolog  *log.Helper
}// NewUsecase 创建Usecase
func NewUserUsecase(repo UserRepo, logger log.Logger) *UserUsecase {return &UserUsecase{repo: repo, log: log.NewHelper(logger)}
}// CreateUser 创建用户
func (uc *UserUsecase) CreateUser(ctx context.Context, req *users.CreateUserRequest) (*users.CreateUserReply, error) {return uc.repo.CreateUser(ctx, req)
}// ListUser 获取用户列表
func (uc *UserUsecase) ListUser(ctx context.Context, req *users.ListUserRequest) ([]*users.UserData, error) {return uc.repo.ListUser(ctx, req)
}

我把数据表的模型放到了data/dal目录下了 app/users/internal/data/dal/user.go

package daltype UserMo struct {Id    int64Age   int32Name  stringEmail string
}func (u *UserMo) TableName() string {return "users"
}

data/user.go

package dataimport ("context""github.com/go-kratos/kratos/v2/log""xgs_kratos/app/users/internal/biz""xgs_kratos/app/users/internal/data/dal""xgs_kratos/gen/users"
)//data 层处理数据的存储和读取type userRepo struct {data *Datalog  *log.Helper
}// NewUserRepo .
func NewUserRepo(data *Data, logger log.Logger) biz.UserRepo {return &userRepo{data: data,log:  log.NewHelper(logger),}
}// CreateUser 创建用户
func (r *userRepo) CreateUser(ctx context.Context, req *users.CreateUserRequest) (*users.CreateUserReply, error) {user := dal.UserMo{Age:   req.Age,Name:  req.Name,Email: req.Email,}result := r.data.db.Create(&user)if result.Error != nil {return nil, result.Error}return &users.CreateUserReply{Id: user.Id,}, nil
}func (r *userRepo) ListUser(ctx context.Context, req *users.ListUserRequest) ([]*users.UserData, error) {var results []dal.UserMores := r.data.db.Find(&results)if res.Error != nil {return nil, res.Error}var userDatas []*users.UserDatafor _, result := range results {userDatas = append(userDatas, &users.UserData{Id:    result.Id,Name:  result.Name,Age:   result.Age,Email: result.Email,})}return userDatas, nil
}

根目录下执行 buf generate

 buf generatekratos run

postman请求新增

获取列表

项目的代码  码云 https://gitee.com/gebilaoxie/xgs_kratos.git

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 后端返回列表中包含图片id,如何将列表中的图片id转化成url
  • vue3 命令运行窗口暴露网络地址,以及修改端口号
  • AI技术革命对未来就业的影响
  • GUI图形化界面操作(下部)
  • 基于Java的微博传播分析系统的设计与实现
  • 设计模式实战:任务调度系统的设计与实现
  • Vue2从基础到实战(v-bind对于样式控制的增强-操作style)
  • Python 和 Boto3 生成 Amazon S3 对象的 HTTPS URL
  • 2025第十九届中国欧亚国际军民两用技术及西安国防电子航空航天暨无人机展
  • UE5.4内容示例(3)FBX_Import_Options - 学习笔记
  • postMessage 收到消息类型 “webpackWarnings“
  • C#实现数据采集系统-modbustcp数据通知
  • 云服务器部署vite前端项目
  • Flink内存管理机制
  • 第三届人工智能、物联网和云计算技术国际会议(AIoTC 2024,9月13-15)
  • 30秒的PHP代码片段(1)数组 - Array
  • Kibana配置logstash,报表一体化
  • MaxCompute访问TableStore(OTS) 数据
  • Python学习笔记 字符串拼接
  • Swift 中的尾递归和蹦床
  • tensorflow学习笔记3——MNIST应用篇
  • Vue.js 移动端适配之 vw 解决方案
  • vue+element后台管理系统,从后端获取路由表,并正常渲染
  • 记一次用 NodeJs 实现模拟登录的思路
  • 码农张的Bug人生 - 初来乍到
  • 每个JavaScript开发人员应阅读的书【1】 - JavaScript: The Good Parts
  • 排序算法之--选择排序
  • 什么是Javascript函数节流?
  • 我感觉这是史上最牛的防sql注入方法类
  • 新版博客前端前瞻
  • 要让cordova项目适配iphoneX + ios11.4,总共要几步?三步
  • ​猴子吃桃问题:每天都吃了前一天剩下的一半多一个。
  • #android不同版本废弃api,新api。
  • (1)SpringCloud 整合Python
  • (10)ATF MMU转换表
  • (10)Linux冯诺依曼结构操作系统的再次理解
  • (delphi11最新学习资料) Object Pascal 学习笔记---第13章第6节 (嵌套的Finally代码块)
  • (pytorch进阶之路)CLIP模型 实现图像多模态检索任务
  • (补充):java各种进制、原码、反码、补码和文本、图像、音频在计算机中的存储方式
  • (附源码)springboot 个人网页的网站 毕业设计031623
  • (函数)颠倒字符串顺序(C语言)
  • (十八)SpringBoot之发送QQ邮件
  • (学习日记)2024.04.10:UCOSIII第三十八节:事件实验
  • (转)Linux下编译安装log4cxx
  • (转)memcache、redis缓存
  • (转)如何上传第三方jar包至Maven私服让maven项目可以使用第三方jar包
  • (转)自己动手搭建Nginx+memcache+xdebug+php运行环境绿色版 For windows版
  • . ./ bash dash source 这五种执行shell脚本方式 区别
  • .bat批处理(七):PC端从手机内复制文件到本地
  • .NET Core 项目指定SDK版本
  • .NET Framework 的 bug?try-catch-when 中如果 when 语句抛出异常,程序将彻底崩溃
  • .Net IE10 _doPostBack 未定义
  • .net 简单实现MD5
  • .NET/C# 检测电脑上安装的 .NET Framework 的版本
  • .NetCore发布到IIS