自由気ままにブログ

地方零細企業プログラマがひっそりとなにかしています。

構造体無しのデータベース情報をゴリ押しでjson型にする

f:id:nono138:20200421225921p:plain

以前書いた、構造体無しでのDBデータを取得するやり方を紹介しました。

 

nono138.hatenablog.com

実際にデータをブラウザ側に送る時に、json型で送ることが多いと思いますが、構造体無しだとどうやってjson型にすればいいの??と思うかもしらませんがゴリ押しで行けます。

jsonファイルの作り方も一応、貼っておきます。

nono138.hatenablog.com

 基本的にこの2つの記事を参考にして頂ければ出来ます。

 

では、さっそくサンプルコードを見て見ましょう❗❗

 

 サンプルコード

package main

import (
    "database/sql"
    "encoding/json"
    "fmt"

    _ "github.com/mattn/go-sqlite3"
)

func DbSelect_exec(db *sql.DB, cmd string) (err error) {
    _err = db.Exec(cmd)
    if err != nil {
        fmt.Println(err)
        return err
    }
    return nil
}
func main() {
    DBerr := sql.Open("sqlite3""sample.db")
    if err != nil {
        fmt.Println(err)
    }
    //テーブルデータ取得
    cmd := "SELECT * FROM userinfo"
    rows_ := DB.Query(cmd)

    defer rows.Close()

    // カラム情報を取得する
    types_ := rows.ColumnTypes()
    data := make(interface{}, len(types))

    // カラム数分だけポインターを保管するinterfaceを用意
    dataPtrs := make(interface{}, len(types))
    err = DbSelect_exec(DB, cmd)
    if err != nil {
        fmt.Println(err)
    }
    //dataPtrsにアドレスを受け渡し(nil対応の為)
    for i := range data {
        //pointerを渡し、可読データに変換
        dataPtrs[i] = &data[i]
    }

    //json用mapの作成
    jsonMap := make(map[string]interface{})

    for rows.Next() {
        err := rows.Scan(dataPtrs...)
        if err != nil {
            fmt.Println(err)
        }
        for icolumntype := range types {
            jsonMap[columntype.Name()] = data[i]
        }
        byteserr := json.Marshal(jsonMap)
        if err != nil {
            fmt.Println(err)
        }
        fmt.Println(string(bytes))
    }
}

結果

{"Category":"男性","Chord":1,"RecordDate":"1970-08-22T19:13:38Z","UserName":"テスト 太郎"}

{"Category":"女性","Chord":2,"RecordDate":"1970-08-22T19:13:38Z","UserName":"テスト 花子"}

 解説

解説と言う程ではないのですが、今回は上記で示した2つの記事をただ併用しただけですね。

一応、初学者だと分かりにくいと思うので、一部分だけではなく、全てのコードを載せておきました。

json.Marshalは構造体配列だけで無く、mapも受け付けてくれるのでそれを利用しました。

今回は、DBのカラム名をキーにしてあげていますね。

スコープの外で、全ての情報を扱ってあげたい場合は、bytesを宣言してあげて、appendなり、copyなりを使ってあげると全ての情報を扱うことが出来ると思います。

 

個人的書き置き場

全ての情報をスコープの外で扱おうとするとかなりのメモリーを使うので、扱う際には注意して下さい。

理に反する処理かもしれませんが、結構ゴリ押しコードも好きだったりします。

 

Goはまだ、日本での浸透率が低いので、PythonjavaScriptを書けば、ブログのアクセス率も上がるんだろうなと思いながら、Goを書いています。

面倒なのもありますが、Goを学習して間もない方の助けになれれば幸いです。

私自身、この業界自体は嫌いじゃないので、少しでもこの業界が賑わえばいいなと思います。

 

また、最近ブロガーになりたいのか見つめ直してみて、特になにも感じなかったので、ブロガーを対象にしたtwitterハッシュタグはやめる方針でいます。

ネットビジネス勧誘が好きじゃないからですね。