一鍵生成 後端 restful api
說明
主要用這個庫 gitee.com/konyshe/gogo, 詳情可以去查看說明文件。
只要連接好數據庫表,不用 數據庫的 models文件,就可以最簡單的辦法 生成 restful api.
原項目有一個小問題,
需要修改 源碼 SQLUtils.go
239行修改
case "INT":
{
queryData[queryCount][a] = new(sql.NullInt64)
}
290 追加
case *sql.NullInt64:
result[columnsType[a].Name()] = *s
是因爲涉及到 數據庫裏面 int 字段 允許爲空,默認是null, 數據庫讀取的時候 會報錯
sql: Scan error on column index 3, name "created_on": converting driver.Value type <nil> ("<nil>") to a int32: invalid syntax
demo
package main
import (
"net/http"
"strconv"
"gitee.com/konyshe/gogo"
)
func main() {
// 初始化數據庫連接
if err := gogo.SQLInit("mysql", "root:1234567890@tcp(192.168.100.50:3306)/go?charset=utf8&parseTime=true", 10, 1); err != nil {
gogo.Log().Error(err.Error())
return
}
// 增
gogo.POST("/restful/:tablename", func(ctx *gogo.HTTPContext) {
affect, err := gogo.SQLInsert(
ctx.GetPathParam(":tablename"),
ctx.GetPostBody())
if err != nil {
gogo.Log().Error(err.Error())
ctx.WriteString(err.Error())
} else {
ctx.WriteString(strconv.FormatInt(affect, 10))
}
})
// 刪
gogo.DELETE("/restful/:tablename/:id", func(ctx *gogo.HTTPContext) {
affect, err := gogo.SQLDelete(
ctx.GetPathParam(":tablename"),
"id="+ctx.GetPathParam(":id"))
if err != nil {
gogo.Log().Error(err.Error())
ctx.WriteString(err.Error())
} else {
ctx.WriteString(strconv.FormatInt(affect, 10))
}
})
// 改
gogo.PUT("/restful/:tablename/:id", func(ctx *gogo.HTTPContext) {
affect, err := gogo.SQLUpdate(
ctx.GetPathParam(":tablename"),
"id="+ctx.GetPathParam(":id"),
ctx.GetPostBody())
if err != nil {
gogo.Log().Error(err.Error())
ctx.WriteString(err.Error())
} else {
ctx.WriteString(strconv.FormatInt(affect, 10))
}
})
// 查
gogo.GET("/restful/:tablename/:id", func(ctx *gogo.HTTPContext) {
queryData, err := gogo.SQLQueryByMap(
"",
ctx.GetString("feilds"),
ctx.GetPathParam(":tablename"),
"id="+ctx.GetPathParam(":id"),
"", 0, 1)
if err != nil {
gogo.Log().Error(err.Error())
ctx.WriteString(err.Error())
} else {
ctx.WriteJSON(queryData)
}
})
// 查
gogo.GET("/restful/:tablename", func(ctx *gogo.HTTPContext) {
queryData, err := gogo.SQLQueryByMap(
ctx.GetString("columnname"),
ctx.GetString("feilds"),
ctx.GetPathParam(":tablename"),
ctx.GetString("where"),
ctx.GetString("order"),
ctx.GetInt("offset", 0),
ctx.GetInt("count", 10))
if err != nil {
gogo.Log().Error(err.Error())
ctx.WriteString(err.Error())
} else {
ctx.WriteJSON(queryData)
}
})
// 404頁面
gogo.STATUS(http.StatusNotFound, func(ctx *gogo.HTTPContext) {
ctx.WriteHeader(http.StatusNotFound)
l, err := gogo.SQLQueryByMap("webname", "*", "dede_flink", "", "", 0, 100)
if err == nil {
ctx.WriteExecute(l,
"views/notfound.tmpl")
return
}
})
// 啓動HTTP服務
gogo.Run(":8080")
}