Я следовал этому руководству о том, как настроить базовый API с PostgreSQL, Gorilla Mux и GORM.
Это мое приложение:
package main
import (
"encoding/json"
"net/http"
"github.com/gorilla/mux"
"github.com/jinzhu/gorm"
_ "github.com/jinzhu/gorm/dialects/postgres"
)
var db *gorm.DB
type Ticket struct {
gorm.Model
InfoHash string
Status *int `gorm:"default:'0'"`
}
func main() {
router := mux.NewRouter()
db, err := gorm.Open("postgres", "host=localhost user=user dbname=db_development password=password sslmode=disable")
db.LogMode(true)
if err != nil {
panic(err)
}
defer db.Close()
db.AutoMigrate(&Ticket{})
router.HandleFunc("/", TicketsIndex).Methods("GET")
http.ListenAndServe(":3000", router)
}
func TicketsIndex(w http.ResponseWriter, r *http.Request) {
tickets := []Ticket{}
db.Find(&tickets)
json.NewEncoder(w).Encode(&tickets)
}
Проблема в том, что когда я захожу на localhost:3000
, сервер просто останавливается без журналов ошибок, просто останавливается и выходит из приложения. Он должен вернуть билеты, хранящиеся в базе данных, в формате JSON.
Я получу это, если открою базу данных в моей функции TicketsIndex и закрою ее, как это:
func TicketsIndex(w http.ResponseWriter, r *http.Request) {
db, err := gorm.Open("postgres", "host=localhost user=user dbname=db_development password=password sslmode=disable")
tickets := []Ticket{}
db.Find(&tickets)
json.NewEncoder(w).Encode(&tickets)
defer db.Close()
}
Но я думаю, что это не правильный путь. Я также пытаюсь переместить этот код в основную функцию и также работает:
tickets := []Ticket{}
db.Find(&tickets)
Итак, я предполагаю, что это может быть глобальная переменная var db *gormDB
, которая назначается неправильно. Что я делаю не так?