为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
慕容森 2022-12-19 21:30:44
我想如果我继续使用下面的方法,我将不得不编写太多代码。我声明了所有表的结构。我使用 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}吗?请给我任何建议....谢谢。
查看完整描述

1 回答

?
慕侠2389804

TA贡献1719条经验 获得超6个赞

你可以使用 ORM 包,比如 GORM 来简化你的工作。

或者你可以制作一个通用处理程序并使用反射包,分析你定义的结构并动态地进行每个 SQL 查询。但如果您的任何结构具有内部切片、其他嵌入式结构,或者如果您需要使用连接表,您还必须手动处理它,这不是最佳解决方案。我有服务器,我们有超过 200 个端点,有超过 3-400 个方法和 200 多个 SQL 表,整个服务器是手工编写的。但我可以说,处理程序和 DB func 无需修改即可重用的情况非常少见。

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


查看完整回答
反对 回复 2022-12-19
  • 1 回答
  • 0 关注
  • 91 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信