【问题标题】:Golang API Gorilla MySQL queryGolang API 大猩猩 MySQL 查询
【发布时间】:2020-02-05 07:09:01
【问题描述】:

所以...我终于完成了包含超级书呆子桌面游戏 Warhammer 的副项目,我在其中创建了一个数据库 MySQL,下一步是创建一个 API。

此时我有三张桌子……“tyranids”、“greyknghts”和“deathguard”。我想进行动态查询以选择目标表。我能够做到这一点,但随着表格的增长,我需要使这个动态化。

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)

}

谢谢。

【问题讨论】:

    标签: mysql api go gorilla mux


    【解决方案1】:

    您可以创建一个map 来将表与键配对:

    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"])
    

    【讨论】:

      猜你喜欢
      • 2014-03-15
      • 2018-06-08
      • 1970-01-01
      • 1970-01-01
      • 2015-11-20
      • 2018-09-05
      • 2023-02-20
      • 2014-11-24
      • 2015-03-30
      相关资源
      最近更新 更多