猿问

如何为 Golang 中的表过多设计 RestAPI

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


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


[类型.go]


type TableA struct {

    Field1 string `json:"field1" validate:"required, max=10"`

    Field2 int    `json:"field2" validate:"number"`

}


type TableB struct {

    ...

}

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


[表A.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

}

这是从上面的处理函数调用的数据库函数(使用 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 个数据库函数。有什么办法可以使用类似的东西/tables/{tableName}吗?请给我任何建议....谢谢。


慕容森
浏览 137回答 1
1回答

慕侠2389804

你可以使用 ORM 包,比如 GORM 来简化你的工作。或者你可以制作一个通用处理程序并使用反射包,分析你定义的结构并动态地进行每个 SQL 查询。但如果您的任何结构具有内部切片、其他嵌入式结构,或者如果您需要使用连接表,您还必须手动处理它,这不是最佳解决方案。我有服务器,我们有超过 200 个端点,有超过 3-400 个方法和 200 多个 SQL 表,整个服务器是手工编写的。但我可以说,处理程序和 DB func 无需修改即可重用的情况非常少见。也许您可以将错误处理、回滚/提交、json 解析和响应部分包装在一个 func 中,然后使用它来调用 DB 方法。
随时随地看视频慕课网APP

相关分类

Go
我要回答