当表格发生变化时,立即使用gRPC流式传输数据库数据。

huangapple go评论85阅读模式
英文:

Stream DB data as soon as table is changed with gRPC

问题

我正在使用Go、gRPC和Postgres制作任务列表。

当调用PostItem插入新数据时,如何自动流式传输数据?我需要订阅Postgres,还是可以在没有订阅或发布-订阅的情况下完成?


// ProtoBuf模式

syntax = "proto3";

package tasklist;

import "google/protobuf/empty.proto";

service TodoList {
  rpc GetTasks(google.protobuf.Empty) returns (stream GetTasksResponse) {}
  rpc PostItem(PostItemRequest) returns (PostTaskRequest) {}
}


message Task {
  int64 id = 1;
  string name = 2;
}

message GetTasksResponse {
  Task task = 1;
}

message PostTaskRequest {
  Task Task = 1;
}

message PostItemResponse {
  bool result = 1;
}


// Postgres表模式

create table Task (
  id integer not null PRIMARY KEY,
  name varchar(10) not null
);

// Go

func (s *server) GetTasks(_ *empty.Empty, stream pb.TaskList_GetTasksServer) error {
    // 当调用`PostTask`更新数据库时,如何流式传输数据? <- <-
	for _, r := range s.requests {
		// 流式传输数据
	}
}

func (s *server) PostTask(ctx context.Context, r *pb.PostTaskRequest) (*pb.PostTaskResponse, error) {
	// 在这里更新Postgres
    return &pb.PostItemResponse{Result: true}, nil
}

英文:

I am making Task List using Go, gRPC and Postgres.

How can I automatically stream the data as soon as PostItem is called to insert the new data? Do I need to subscribe the Postgres or can I accomplish this without subscription or pub-sub?


// ProtoBuf schema

syntax = &quot;proto3&quot;;

package tasklist;

import &quot;google/protobuf/empty.proto&quot;;

service TodoList {
  rpc GetTasks(google.protobuf.Empty) returns (stream GetTasksResponse) {}
  rpc PostItem(PostItemRequest) returns (PostTaskRequest) {}
}


message Task {
  int64 id = 1;
  string name = 2;
}

message GetTasksResponse {
  Task task = 1;
}

message PostTaskRequest {
  Task Task = 1;
}

message PostItemResponse {
  bool result = 1;
}


// Postgres Table Schema

create table Task (
  id integer not null PRIMARY KEY,
  name varchar(10) not null
);

// Go

func (s *server) GetTasks(_ *empty.Empty, stream pb.TaskList_GetTasksServer) error {
    // How can I steam data as soon as `PostTask` is called to update db? &lt;- &lt;-
	for _, r := range s.requests {
		// stream data
	}
}

func (s *server) PostTask(ctx context.Context, r *pb.PostTaskRequest) (*pb.PostTaskResponse, error) {
	// update Postgres here
    return &amp;pb.PostItemResponse{Result: true}, nil
}

答案1

得分: 1

我猜s.requests是类似于chan Task的东西。所以在成功的// update Postgres here之后,你可以将你的请求发送到chan中。

func (s *server) PostTask(ctx context.Context, r *pb.PostTaskRequest) (*pb.PostTaskResponse, error) {
    postTask := toDomain(r)
    err := s.service.UpdateTask(ctx, postTask)
    if err != nil {
        return nil, status.Error(codes.Internal, err.Error())
    }
    s.requests <- postTask
    return &pb.PostItemResponse{Result: true}, nil
}

请注意,这只是代码的翻译部分,不包括任何其他内容。

英文:

I guess s.requests is something like chan Task. So after successful // update Postgres here you might send your request in chan.

func (s *server) PostTask(ctx context.Context, r *pb.PostTaskRequest) (*pb.PostTaskResponse, error) {
    postTask := toDomain(r)
    err := s.service.UpdateTask(ctx, postTask)
    if err != nil {
        return nil, status.Error(codes.Internal, err.Error())
    }
    s.requests &lt;- postTask
    return &amp;pb.PostItemResponse{Result: true}, nil
}

huangapple
  • 本文由 发表于 2023年1月12日 17:29:30
  • 转载请务必保留本文链接:https://go.coder-hub.com/75094107.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定