英文:
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 = "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 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? <- <-
for _, r := range s.requests {
// stream data
}
}
func (s *server) PostTask(ctx context.Context, r *pb.PostTaskRequest) (*pb.PostTaskResponse, error) {
// update Postgres here
return &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 <- postTask
return &pb.PostItemResponse{Result: true}, nil
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论