我想如果我继续使用下面的方法,我将不得不写太多的代码。
我声明了所有表的结构。我使用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方法。