

ただいまGAE+CloudSQLを使って簡単なAPIを作っています。  
DBの全データを取得できるAPIを実装しようとし、以下のコードを作りました。

[code]

    package main
    
    import (
        "encoding/json"
        "fmt"
        _ "github.com/go-sql-driver/mysql"
        "github.com/jinzhu/gorm"
        "log"
        "net/http"
        "os"
    )
    
    type Person struct {
        gorm.Model
        Name string `json:"name"`
        Age  int    `json:"age"`
    }
    
    var db *gorm.DB
    
    func main() {
        db = DB()
    
        http.HandleFunc("/user", func(w http.ResponseWriter, r *http.Request) {
            defer db.Close()
            var people []Person
            db.Find(&people)
            str, _ := json.Marshal(people)
            fmt.Printf("%s\n", str)
            return
        })
    
        port := os.Getenv("PORT")
        if port == "" {
            port = "8080"
            log.Printf("Defaulting to port %s", port)
        }
    
        log.Printf("Listening on port %s", port)
        log.Fatal(http.ListenAndServe(fmt.Sprintf(":%s", port), nil))
    }
    
    func DB() *gorm.DB {
        var (
            connectionName = os.Getenv("CLOUDSQL_CONNECTION_NAME")
            user           = os.Getenv("CLOUDSQL_USER")
            password       = os.Getenv("CLOUDSQL_PASSWORD")
            socket         = os.Getenv("CLOUDSQL_SOCKET_PREFIX")
            databaseName   = os.Getenv("CLOUDSQL_DATABASE_NAME")
            option         = os.Getenv("CLOUDSQL_OPTION")
        )
    
        if socket == "" {
            socket = "/cloudsql"
        }
        if option == "" {
            option = "?parseTime=true"
        }
    
        dbURI := fmt.Sprintf("%s:%s@unix(%s/%s)/%s%s", user, password, socket, connectionName, databaseName, option)
        conn, err := gorm.Open("mysql", dbURI)
        if err != nil {
            panic(fmt.Sprintf("DB: %v", err))
        }
    
        return conn
    }
    
[/code]

しかし、これを実装しAPIを叩くと、何も出力されません。  
原因を調べてみると、  
db.Find(&people)  
のあとのpeopleが、配列の要素数はDBのデータ数と合っていましたが中身がすべて空文字や0になっていました。

実装に問題があるのか、GCPの設定に問題があるのかさっぱりわかりません。  
どなたか解決策を教えてください。よろしくお願いいたします。


CC BY-SA 4.0
2019-07-11T17:01:11.550
56572
2019-11-23T14:25:15.130
35077
question
go google-app-engine gorm
GORMのFindを使ってDBの中身を取得したが、すべて空になる


`Person`に

[code]

    `gorm:"column:name"`
    
[/code]

の形式でカラム名の指定がないため、データベースから取得した行を構造体にマッピングできず、すべての要素が空要素になったように見えますがいかがでしょうか？

<https://gorm.io/docs/models.html>


CC BY-SA 4.0
2019-07-27T02:48:41.803
56933
2019-07-27T02:48:41.803
29341
56572
answer


すみません、簡単なミスをしていました。

[code]

    http.HandleFunc("/user", func(w http.ResponseWriter, r *http.Request) {
        defer db.Close()
        ~~~~
    })
    
[/code]

と書いていたので、この関数の実行が終わるとDB接続が切れてしまいますね。  
コードを修正しdb.Close()をmain文直下に書くと、  
person.Nameもperson.Ageも取得することができました。


CC BY-SA 4.0
2019-11-23T14:25:15.130
60793
2019-11-23T14:25:15.130
35077
56572
answer