Golang API Gorilla MySQL запрос - PullRequest
       34

Golang API Gorilla MySQL запрос

0 голосов
/ 05 февраля 2020

Итак ... я наконец-то делаю свой побочный проект, содержащий настольную игру супер всезнайка Warhammer, в которой я создал базу данных MySQL, и мой следующий шаг - создание API.

В данный момент у меня три таблицы: "тираниды", "грейкнхты" и "страж смерти". Я хочу сделать динамический запрос c, чтобы выбрать целевую таблицу. Я могу сделать это, но по мере роста таблиц мне нужно сделать эту динамику c.

func getTyranids(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-type", "application/json")

var units []Unit

result, err := db.Query("SELECT * FROM tyranids")

if err != nil {
    panic(err.Error)
}

defer result.Close()

for result.Next() {
    var unit Unit
    err := result.Scan(&unit.ID, &unit.Name, &unit.Type, &unit.Movement, &unit.WeaponsSkill, &unit.BallisticSkill, &unit.Strength, &unit.Toughness, &unit.Wounds, &unit.Attacks, &unit.Leadership, &unit.Initiate, &unit.Points)
    if err != nil {
        panic(err.Error)
    }
    units = append(units, unit)
}
json.NewEncoder(w).Encode(units)

}

Как я могу написать это, чтобы мне не понадобилась функция для каждой таблицы?

Я сделал так, чтобы он работал с mux.Vars для каждого отдельного устройства.

func getTyranidUnit(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json")

params := mux.Vars(r)

result, err := db.Query("SELECT * FROM tyranids WHERE name = ?", params["name"])
if err != nil {
    panic(err.Error())
}
defer result.Close()

var unit Unit

for result.Next() {
    err := result.Scan(&unit.ID, &unit.Name, &unit.Type, &unit.Movement, &unit.WeaponsSkill, &unit.BallisticSkill, &unit.Strength, &unit.Toughness, &unit.Wounds, &unit.Attacks, &unit.Leadership, &unit.Initiate, &unit.Points)

    if err != nil {
        panic(err.Error())
    }
}
json.NewEncoder(w).Encode(unit)

}

func main() {

db, err = sql.Open("mysql", "xx:xx@tcp(xxx)/Warhammer")

if err != nil {
    panic(err.Error())
}

defer db.Close()

router := mux.NewRouter().StrictSlash(true)

router.HandleFunc("/tyranids", getTyranids).Methods("GET")
router.HandleFunc("/tyranids/{name}", getTyranidUnit).Methods("GET")    

http.ListenAndServe(":8001", router)

}

Спасибо.

1 Ответ

0 голосов
/ 05 февраля 2020

Вы можете просто создать карту , чтобы связать таблицы с ключами:

speciesUnitMap:= map[string]string{
    "Norn-Queen": "tyranids",
    "Hive Tyrant": "tyranids",
    "Rippers ": "tyranids",
    "Hive Ship": "tyranids",
‎    "Ork Boyz": "orcs",
    "‎Waaagh!": "orcs",
‎    "Warboss": "orcs",
    "‎Blood Axes" "orcs",

}


// This is dirty I would construct the string before 
// and do verifications that the received param is conform
result, err := db.Query("SELECT * FROM " + 
       speciesUnitMap[params["name"]] + " WHERE name = ?", params["name"])
...