亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何為 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 關注
  • 109 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號