现在,我尝试使用 GAE+CloudSQL 制作一个 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("%sn", 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
}
在云的帮助下,我可以获取人员数据。
people.length 等于数据库数据的数量。
但是,我得到的是
人。名称是"和人。年龄 = 0。
我不明白为什么我无法获得任何数据。请告诉我如何解决此问题。
我找到了如何能够获得正确的person.Name
和person.Age
。
我在http.HandleFunc
写了defer db.Close()
.因此,一旦调用此函数,数据库连接就会关闭。
我应该把defer db.Close()
放在主函数的开头。
我很抱歉有一个简单的错误,但刷新理解。