![表更改后立即使用 gRPC 传输数据库数据](https://img.php.cn/upload/article/000/887/227/170710497393363.jpg)
問題內容
我正在使用 go、grpc 和 postgres 製作任務清單。
如何在呼叫 postitem
插入新資料時自動串流資料?我需要訂閱 postgres 還是可以在不訂閱或發布訂閱的情況下完成此操作?
// protobuf 架構
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | 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 表架構
1 2 3 4 | create table task (
id integer not null primary key,
name varchar(10) not null
);
|
登入後複製
// 繼續
1 2 3 4 5 6 7 8 9 10 11 | func (s *server) GetTasks(_ * empty . Empty , stream pb.TaskList_GetTasksServer) error {
for _, r := range s.requests {
}
}
func (s *server) PostTask(ctx context.Context, r *pb.PostTaskRequest) (*pb.PostTaskResponse, error) {
return &pb.PostItemResponse{Result: true}, nil
}
|
登入後複製
正確答案
我猜 s.requests
類似於 chan task
。因此,在成功 // update postgres here
之後,您可以在 chan 中發送您的請求。
1 2 3 4 5 6 7 8 9 | 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
}
|
登入後複製
以上是表更改後立即使用 gRPC 傳輸資料庫數據的詳細內容。更多資訊請關注PHP中文網其他相關文章!