我想如果我继续使用下面的方法,我将不得不编写太多代码。我声明了所有表的结构。我使用 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 方法。
- 1 回答
- 0 关注
- 91 浏览
添加回答
举报
0/150
提交
取消