如何在Golang中为太多的表设计RestAPI



我想如果我继续使用下面的方法,我将不得不写太多的代码。


我声明了所有表的结构。我使用go validate包进行验证。

[types.go]

type TableA struct {
Field1 string `json:"field1" validate:"required, max=10"`
Field2 int    `json:"field2" validate:"number"`
}
type TableB struct {
...
}

  • 并且为每个方法初始化路由器并连接处理程序。

    [tableA.go]

    router.Get("/table-a", r.Get_tableA_Handler),
    router.Post("/table-a", r.Post_tableA_Handler),
    router.Patch("/table-a", r.Patch_tableA_Handler),
    router.Delete("/table-a", r.Delete_tableA_Handler)
    ...
    

  • 每个处理程序解析请求体中的json,验证数据并调用db函数。

    [tableA_router.go]

    func (rt *tableARouter) Post_tableA_Handler(w http.ResponseWriter, r *http.Request) error {
    //Json to Struct
    req := new(types.tableA)
    if err := httputils.DecodeJsonBody(r, req); err != nil {
    return err
    }
    // Validation 
    if err := validCheck(req); err != nil { 
    return err
    }
    // DB function
    err := rt.insert_tableA_DB(r.Context(), req) 
    if err != nil {
    return err
    }
    return rt.rd.JSON(w, http.StatusCreated, "Create Success")
    }
    ...
    func validCheck(data interface{}) error {
    validate := validator.New()
    err := validate.Struct(data)
    return err
    }
    

  • 这是一个从上面的handler函数调用的DB函数(使用Gorm)

    [tableA_db.go]

    func (rt *tableARouter) insert_tableA_DB(ctx context.Context, data *types.TableA) error {
    // DB Connect
    db, err := db.Open(rt.dbcfg)
    if err != nil {
    return err
    }
    defer db.Close()
    tx := db.Begin()
    defer tx.Rollback()
    
    // == INSERT ==
    query := `INSERT INTO table_a
    (field1, field2, ...)
    VALUES (?, ?, ...)`
    result := tx.WithContext(ctx).Exec(query,
    data.Field1, data.Field2, ...)
    
    //Result
    if result.Error != nil {
    ...
    }
    

    现在表太多了…如果有100个表,我必须写100个处理程序和100个DB函数。有没有办法使用像/tables/{tableName}这样的东西?请给我任何建议....谢谢你。

    您可以使用ORM包,如GORM,使您的工作更容易。

    或者您可以创建一个通用处理程序,并使用反射包,分析您定义的结构并动态地执行每个SQL查询。但是,如果您的任何结构都有内部切片、其他嵌入结构,或者如果您需要使用连接表,则还必须手动处理,那么这不是最佳解决方案。我有服务器,我们有超过200个端点,超过3-400个方法,200+ SQL表,整个服务器都是手工编写的。但是我可以说,很少有处理程序和DB函数可以在不修改的情况下重用。

    也许你可以把错误处理、回滚/提交、json解析和响应部分包装在一个函数中,然后用它来调用DB方法。

    相关内容

    • 没有找到相关文章

    最新更新