我想如果我繼續使用下面的方法,我將不得不編寫太多代碼。我聲明了所有表的結構。我使用 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 關注
- 109 瀏覽
添加回答
舉報
0/150
提交
取消