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

news2024/12/28 17:47:31

数据库是项目的核心,数据库的链接数据是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 data

import (
	"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 client
	db  *gorm.DB
	log *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 service

import (
	"context"
	"xgs_kratos/app/users/internal/biz"

	pb "xgs_kratos/gen/users"
)

type UserService struct {
	pb.UnimplementedUserServer
	uc *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 biz

import (
	"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 UserRepo
	log  *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 dal

type UserMo struct {
	Id    int64
	Age   int32
	Name  string
	Email string
}

func (u *UserMo) TableName() string {
	return "users"
}

data/user.go

package data

import (
	"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 *Data
	log  *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.UserMo
	res := r.data.db.Find(&results)
	if res.Error != nil {
		return nil, res.Error
	}

	var userDatas []*users.UserData
	for _, 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 generate

kratos run

postman请求新增

获取列表

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1953238.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

鸿蒙UI系统组件10——菜单(Menu)

果你也对鸿蒙开发感兴趣,加入“Harmony自习室”吧!扫描下面名片,关注公众号。 Menu是菜单接口,一般用于鼠标右键弹窗、点击弹窗等。 1、创建默认样式的菜单 菜单需要调用bindMenu接口来实现。bindMenu响应绑定组件的点击事件&am…

ModuleNotFoundError: No module named ‘py3langid‘ 以及如何将包安在虚拟环境下

前提:已经安装过改包(pip install py3langid),但仍报错 原因:安装在其他目录下了 解决办法: 1、再次在终端输入pip install py3langid 显示安装位置 Requirement already satisfied: py3langid in c:\…

css大屏设置中间元素四周渐变透明效果

css大屏设置中间元素四周渐变透明效果 四周透明效果: // 设置蒙版上下左右渐变显示mask-image: linear-gradient(to right, rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, 1) 10%, rgba(0, 0, 0, 1) 90%, rgba(0, 0, 0, 0) 100%),linear-gradient(to bottom, rgba(0, 0, 0…

性能测试的指标及流程

性能测试指标 相应时间 并发数 吞吐量: 点击数 错误率 资源使用率 所有的东西是存在磁盘里的,在代码运行的时候会将磁盘的东西读取到内存里,磁盘IO和网络都是衡量速度,在任务管理器可查看资源使用率 题: 答案&#xf…

创建vue3项目,以及使用示例

1.在根目录下cmd:vue create myobj(没有切换淘宝镜像记得切换,这样创建项目运行快) 2. 3.(按空格键选中,选好回撤就到下一步了) 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.然后输入执行以下两步就已经运行项目了 以…

Java算法之递归算法-如何计算阶乘的值

上一篇学了递归之后,练习一下递归算法。 题目:使用递归算法计算阶乘的值,也就是5!5*4*3*2*1,直接使用循环是非常简单的,这边练习一下递归算法。 先写一下两个条件 基线条件:等于1的时候返回1…

windows下实现mongodb备份还原

添加环境变量 把mongodb安装目录下的bin路径添加到环境变量的path路径: 备份库 打开CMD,执行以下命令: mongodump -u test -p test -d test -o D://backup_mongodb//20220706 –gzip 参数说明: -u 用户名 -p 密码 -d 需要备份的库名称…

GraphHopper路劲规划导航(Android源码调试运行)

本文主要记录在运行graphhopper安卓版路径规划导航源码的步骤和遇到的问题。 成功运行了程序,但是路劲规划一直不成功,问题一开始是服务地址,后来又是key的问题,在这个项目中涉及到了graphhopper、mapbox、mapilion的key&#xff…

map、foreach、filter这些方法你还不知道什么时候该用哪个吗?那就看过来

forEach:‌主要用于遍历数组并对每个元素执行某种操作,‌通常用于改变当前数组里的值。‌它不会返回新数组,‌而是直接在原数组上进行操作。‌forEach方法不支持return、‌break、‌continue等语句,‌因为这些语句在forEach中不会…

多线程实例-线程池

线程池,就是把线程提前从系统中申请好,放到一个地方,后面需要使用线程的时候,直接从这个地方取,而不是从系统重新申请,线程用完之后也回到刚才的地方。 线程池的优点:降低线程创建和销毁的开销…

MICA:面向复杂嵌入式系统的混合关键性部署框架

背景 在嵌入式场景中,虽然 Linux 已经得到了广泛应用,但并不能覆盖所有需求,例如高实时、高可靠、高安全的场合。这些场合往往是实时操作系统的用武之地。有些应用场景既需要 Linux 的管理能力、丰富的生态,又需要实时操作系统的高…

戴尔vostro15-3568硬盘升级+系统重装

硬盘升级 原2.5机械硬盘换成了SATA2.5的固态硬盘 按F2进入bios后看到的电池信息如下: 需要重新换一个电池 系统重装 步骤如下 1.U盘需要格式化成 NTFS 类型的,并且从官网下载后介质 2.BV1z3411K7AD b站这个视频前三步可以参考设置

八、桥接模式

文章目录 1 基本介绍2 案例2.1 OperatingSystem 抽象类2.2 LinuxOS 类2.3 WindowsOS 类2.4 FileOperation 类2.5 FileAppender 类2.6 FileReplicator 类2.7 Client 类2.8 Client 类运行结果2.9 总结 3 各角色之间的关系3.1 角色3.1.1 Implementor ( 实现者 )3.1.2 ConcreteImpl…

微信答题小程序产品研发-UI界面设计

高保真原型虽然已经很接近产品形态了,但毕竟还不能够直接交付给开发。这时就需要UI设计师依据之前的原型设计,进一步细化和实现界面的视觉元素,包括整体视觉风格、颜色、字体、图标、按钮以及交互细节优化等。 UI设计不仅关系到用户的直观感…

1.c#(winform)编程环境安装

目录 安装vs创建应用帮助查看器安装与使用( msdn) 安装vs 安装什么版本看个人心情,或者公司开发需求需要 而本栏全程使用vs2022进行开发c#,着重讲解winform桌面应用开发 使用***.net framework***开发 那先去官网安装企业版的vs…

这一文,关于Java泛型的点点滴滴 一

作为一个 Java 程序员&#xff0c;用到泛型最多的&#xff0c;我估计应该就是这一行代码&#xff1a; List<String> list new ArrayList<>();这也是所有 Java 程序员的泛型之路开始的地方啊。 不过本文讲泛型&#xff0c;先不从这里开始讲&#xff0c;而是再往前…

CVPR 2024最佳论文分享:Mip-Splatting: 无混叠3D高斯溅射

本推文详细介绍了CVPR 2024最佳论文提名《Mip-Splatting: Alias-free 3D Gaussian Splatting》。该论文的第一作者为 Zehao Yu&#xff08;图宾根大学在读博士&#xff0c;导师&#xff1a;Andreas Geiger &#xff09;。论文提出了一种名为Mip-Splatting的方法&#xff0c;用于…

树和二叉树(不用看课程)

1. 树 1.1 树的概念与结构 树是⼀种非线性的数据结构&#xff0c;它是由 n&#xff08;n>0&#xff09; 个有限结点组成⼀个具有层次关系的集合。把它叫做树是因为它看起来像⼀棵倒挂的树&#xff0c;也就是说它是根朝上&#xff0c;而叶朝下的。 • 有⼀个特殊的结点&am…

大语言模型赋能设施农业:透过“智慧大脑“看智能环境调控

&#xff08;文/ 于景鑫 北京市农林科学院&#xff09;在上一篇专栏文章中,我们从宏观视角探讨了大语言模型为设施农业插上腾飞之翼的广阔前景。而要真正实现这一愿景,还需要在微观层面深入剖析LLM的技术原理和应用路径。本文将聚焦设施农业的核心环节之一——环境调控,看看&qu…