質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Processing

Processingは、オープンソースプロジェクトによるCGのためのプログラミング言語です。Javaをベースにしており、グラフィック機能に特化しています。イメージの生成やアニメーションなど、視覚的なフィードバックを簡単に得ることが可能です。

Q&A

解決済

1回答

1641閲覧

GoでMySQLから取得したデータを加工して表示したい

kagepedia

総合スコア16

Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Processing

Processingは、オープンソースプロジェクトによるCGのためのプログラミング言語です。Javaをベースにしており、グラフィック機能に特化しています。イメージの生成やアニメーションなど、視覚的なフィードバックを簡単に得ることが可能です。

0グッド

0クリップ

投稿2020/05/18 02:11

編集2020/05/19 11:41

DBのカラムとデータを別の構造体に入れてデータの加工を行いたいです。
その時に、DBに入っている生データは別で持っておくとします。

現在は以下のようにして、DBに入っているデータを構造体に割り当てて出力しています。

go

1tasks := []models.Task{} 2for rows.Next() { 3 var task models.Task 4 err := rows.Scan(&task.Id, &task.Task, &task.CreateAt, &task.UpdateAt) 5 6 if err != nil { 7 http.Error(w, err.Error(), http.StatusInternalServerError) 8 return 9 } 10 11 tasks = append(tasks, task) 12 13}

上の元データを利用して新たに出力用のmapを作成したいです。
データを加工するものと、しないものがあるので、DBのカラム情報(key)とデータ(value)として新たに作る方法が知りたいです。

go

1taskOutput := make(map[string]interface{})

アドバイスのほうよろしくお願いします。

※2020/5/19追記
DBテーブル定義

idtaskcreated_atupdated_at
1サンプルタスク2020-05-15 14:37:552020-05-15 14:37:55

model

go

1type Task struct { 2 Id int64 3 Task string 4 CreateAt time.Time 5 UpdateAt time.Time 6} 7

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

細かい情報が伏せられているので補足情報が欲しいところ。

  • modelsの定義またはテーブルの定義
  • DBのカラム情報(key)が具体的に何を指しているのか

仮にkeyがTask.Idと仮定するとして
例えばこのように変更してみてはどうでしょうか?

go

1taskOutput := make(map[string]interface{}) 2for rows.Next() { 3 var task models.Task 4 err := rows.Scan(&task.Id, &task.Task, &task.CreateAt, &task.UpdateAt) 5 if err != nil { 6 http.Error(w, err.Error(), http.StatusInternalServerError) 7 return 8 } 9 taskOutput[task.Id] = task 10}

追記

コメントにて「表示のために意図した形に加工したい」とのこと。
であれば、保持する内容は[]models.Taskのままで大丈夫だと思います。

  • models.Taskを受け取って文字列化する関数を作る。
  • models.TaskにString() stringメソッドを生やす(fmt操作の出力をカスタマイズ)。
  • type CustomTime time.TimeにStringメソッドを生やしてそれをmodels.Taskの日付フィールドの型にする(fmt操作の出力をカスタマイズ)。
  • models.TaskにMarshalJSON() ([]byte, error)というメソッドを生やしてカスタマイズ、出力時はJSONでエンコード。

などなどの方法があります。
上記のような操作を行う「関数」や「構造体ラッピング(models.Taskをフィールドにもつ構造体を定義)」を出力形態別に用意すればOKだと思います。
なのでわざわざ別のmap型コンテナに移し替える必要はないと思います。
(特に表示のためだけであれば)

例えば関数を作った場合は以下のように使えばOK。

go

1func TaskToString(t models.Task) string {...} 2 3func PrintAllTask(tasks []models.Task) { 4 for _, task := range tasks { 5 fmt.Println(TaskToString(task)) 6 } 7}

投稿2020/05/19 06:35

編集2020/05/21 11:38
nobonobo

総合スコア3367

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kagepedia

2020/05/19 11:47 編集

回答ありがとうございます。 情報不足のところ追記しました。 taskOutput(仮)を展開すると [ { "id": 1, "task": "サンプルタスク", "created_at": "2020-05-15 14:37:55", "updated_at": "2020-05-15 14:37:55", }, { "id": 2, "task": "サンプルタスク2", "created_at": "2020-05-16 14:37:55", "updated_at": "2020-05-16 14:37:55", } ] このような配列のものが欲しいです。 日時とかで加工するときは以下のように、元データを使って加工したいです。 const format = "2006/01/02 15:04:05" taskOutput["created_at"] =&task.CreateAt.Format(format)
nobonobo

2020/05/20 02:50

上記の構造は元のコードにあるtasks相当に見えます(mapではなく配列)。 「出力用のmap」がtaskOutput(map型)だとしてkeyは何を指し、valueは何を指すのか具体例 が欲しいです。
kagepedia

2020/05/20 11:26

すみません。 mapのkeyはDBのカラムで、valueはカラムに対応したレコードの値が欲しいです。 そして、全部データを取得し終えたら、taskOutput(仮)で返してあげたいです。
nobonobo

2020/05/20 13:19

「taskOutput map[string]interface{}」は「1レコードの情報だけを持ち」、 taskOutputの配列、つまり「[]taskOutput」が欲しいということですね。 ようやく理解できたような気がします。 少し質問ですが、なぜわざわざ型情報を捨てたmap[string]interface{}の配列が必要なのでしょうか? (もとの[]models.Taskのほうが有用な気がします)
kagepedia

2020/05/20 14:23

出力する際に、元データ(加工前)と加工データを分けた方が直感的にわかりやすいかなと思いました。 Goにおいて出力する際に、DBからのデータを加工して出力する場合、どのような方法が一般的なのでしょうか? const format = "2020/01/01 11:11:11" task["CreateAt"] = task.Id.Format(format) tasks = append(tasks, task) このような感じで加工していくのですかね?
nobonobo

2020/05/21 00:21

私の理解力の問題かもしれませんが、 質問の文章やその後のコメントから漠然とした「加工」の理由と目標が見えません。 いろいろやりたいことがあるのでしょうけれども、 いくつかの例示で良いのでもう少し具体的な理由や目標が知りたい。 例1:索引を作りたい。 ひとつの事例として「データ作成日時」をキーにして「models.Task」を値にしたmapが欲しい。そうすれば「作成日付からデータにアクセスできる」。 例2:表示にまつわる加工をしたい 「表示のため」に日時データをフォーマットしたいなど、例示のテーブル定義に対しどのような表示が欲しいのかがわかればアドバイスしやすいです。
nobonobo

2020/05/21 00:23

例に挙げたどちらの理由であっても型情報を捨てるやり方はお勧めしない方法です。 型情報を捨ててもやりたい加工の理由が知りたいです。
kagepedia

2020/05/21 01:35

質問の仕方が悪くてすみません。 ①表示用にデータを加工したい。 日時は標準出力時に「2020-05-15T15:04:05Z07:00」になるので、「2020-05-15 15:04:05」のように加工したいです。 ②①をするにあたり、どのデータを加工したかをわかりやすく持っておくために別途mapを作成しておきたい。 例:「2020-05-15 15:04:05」のように加工したい場合と「2020年05月15日 15時04分05秒」のように加工したい場合が出てくると思いましたので。 できるならば型を維持しつつ、出力用のデータを加工して作る場合のやり方が知りたかったので、質問いたしました。
kagepedia

2020/05/23 15:43

ありがとうございます。 方法がわかりましたので解決済みに変更しました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問