GORMのFindを使ってDBの中身を取得したが、すべて空になる
ただいまGAE+CloudSQLを使って簡単なAPIを作っています。
DBの全データを取得できるAPIを実装しようとし、以下のコードを作りました。
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
}
しかし、これを実装しAPIを叩くと、何も出力されません。
原因を調べてみると、
db.Find(&people)
のあとのpeopleが、配列の要素数はDBのデータ数と合っていましたが中身がすべて空文字や0になっていました。
実装に問題があるのか、GCPの設定に問題があるのかさっぱりわかりません。
どなたか解決策を教えてください。よろしくお願いいたします。