2016-10-06 12 views
0

SQLクエリから返された値を多次元構造体に割り当てたいと思います。 JSONとしてこの多次元構造体をWebフロントエンドに出力したいと思います。Golangはsqlクエリから多次元構造体に値を代入します

編集:SQLクエリは、単純に 'SELECT * FROM policy'です。これは多くのキー/値を返しますが、この例では 'policy_id'、 'class_id'、 'name'フィールドだけを使用しています。

私の構造体

type table struct { 
    Policy string `json:"policy"` 
    P []Parameters `json:"parameters"` 
    } 

    type Parameters struct { 
    Policy_id string `json:"policy_id"` 
    Class_id string `json:"class_id"` 
    Name string `json:"name"` 
    .... <removed many more entries of the same type> 
    } 

I rows.Nextを使用して、SQLスルー出力、ループ()//問題のために重要ではありません。

私が行う場合:その後、

p := Parameters{} 

err = rows.Scan(&p.Policy_id, &p.Class_id, &p.Name) 

Pは私が期待するキー/値のペアが移入されます。

編集:テーブル構造体の一意キーとしてクエリ文字列から返された名前を使用したいので、p.Nameを追加しました。これは以前は分かりませんでした。

しかし、私は上位レベルの構造体 'テーブル'にデータを取得したいと考えています。最終的にJSONで出力が次のようになります:

{ポリシー: "policyName1"、P:[{policy_id: '1'、class_id:'01 '}、{policy_id:' 2 '、class_id: 「02」}など]}

私はこのようなことを試してみた:

t := table { 
Policy: p.Name, 
P: p, 
} 

およびその他のいくつかの組み合わせが、この時点で私は推測している誰かが、右に私を指すことができます。方向?

+0

私は正しく理解していません。パラメータテーブルにポリシー名が含まれていますか?テーブルに複数のポリシーがありますか? –

+0

可能であれば、表スキーマを表示してください。 –

+0

はい、それは理にかなっていません。そこに「名前」の値を入れる必要があるので、質問を編集します。 – Heath

答えて

1

おそらくこのようなもの:

// a map with policy name as key 
ts := map[string]tables 

defer rows.Close() 
for rows.Next() { 
    p := Parameters{} 
    if err := rows.Scan(&p.Policy_id, &p.Class_id, &p.Name); err != nil { 
     log.Fatal(err) 
    } 

    // initialize the table, if not exists 
    if _, ok := ts[p.Name]; !ok { 
     ts[p.Name] = table{ 
      Policy: p.Name, 
      P: make([]Parameters), 
     } 
    } 

    // append the parameters to the policy 
    ts[p.Name].P = append(ts[p.Name].P, p) 
} 
+0

これはまだ試していない方法です。ありがとうございました。私はそれを行ってあなたの答えを正確に記します。 – Heath

関連する問題