mysql - Golang API gorilla MySQL 查询

标签 mysql api go gorilla mux

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

我现在有三张 table ……“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)

}

谢谢你。

最佳答案

你可以做一个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"])

关于mysql - Golang API gorilla MySQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60070559/

相关文章:

mysql - 如何将这个mysql添加传递给jpql?

java - 为什么 List 中没有 tail() 或 head() 方法来获取最后一个或第一个元素?

php - 如何实现 Paypal Recurring Payment API 并为买家提供通过信用卡/借记卡 php 付款的选项?

戈朗 : Processing 5 huge files concurrently

php - 将utf8字符导入MYSQL

php - 将消息记录的父子层次结构保存到 mysql 中?

mysql - 无法连接到mysql : Unable to load authentication plugin 'caching_sha2_password

c# - HttpResponseMessage.Content.ReadAsStreamAsync() 与 HttpResponseMessage.Content.ReadAsStringAsync()

sql - 如何使用m2m条件查询数据

sql - Golang、数据库/sql、Postgres - 在您需要结果时使用 QueryRow 和 INSERT 不良做法?