2017-01-13 11 views
2

golangのgRPCサーバーストリームに問題があります。 私は1つの行で問題はありませんでしたが、私はちょうどそれに対して単純なgRPC応答を使用しました。 しかし、データベースからいくつかの行を送信する必要があり、サーバーストリームアプリケーションを終了できません。ゴランgRPCサーバーストリーム

私はちょうどGolangとgRPCを学びましたが、この作業は今この課題を解決するのが少し難しいです。ウェブ上でこの資料の例が多すぎないので、誰かがこれを手助けすることができれば非常に感謝します。 ここで、gRPC + golangを使用してデータベースからデータをストリーミングする方法の例を見つけることができます。

.... 

type record struct { 
id  int 
lastname string 
} 

type server struct { 

} 

func (s *server) QueryData(city *pb.City, stream pb.GetDataStream_QueryDataServer) error { 

db, err := sql.Open("postgres", "postgres://adresspass") 
if err != nil { 
    log.Fatal(err) 
} 

defer db.Close() 

rows, err := db.Query(`SELECT id, last_name FROM person WHERE city=$1`, city.City) 
if err != nil { 
    log.Fatal(err) 
} 

var rs = make([]record, 0) 
var rec record 

for rows.Next() { 
    err = rows.Scan(&rec.id, &rec.lastname) 
    if err != nil { 
     return err 
    } 

    rs = append(rs, rec) 
} 

for _, onedata := range rs { 
    if err := stream.Send(onedata); err != nil { 
     return err 
    } 
} 
return nil 
} 

... 
+0

問題はありませんが、コードフォーマットツールを試すことをおすすめします。https://blog.golang.org/go-fmt-your-code – miltonb

+0

@Alex @Alexは、たとえば次のような情報を追加することをお勧めします:エラー期待される結果が何であるかを示します。 – Mark

答えて

0

あなたはプロトコルバッファタイプではなくネイティブ型としてデータベースから値をスキャンする必要があります。私はこのコードを持っているあなたに

をありがとうございます。

あなたがprotoファイルに

message DbVal{ 
uint32 id = 1; 
message string = 2; 
} 

をメッセージ・フォーマットを定義し、ストリームに、その構造体を渡している必要があります。