成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

項目實戰:使用 Fiber + Gorm 構建 Rest API

開發 項目管理
Fiber 作為一個新的 Go 框架,似乎受追捧程度很高,Star 數飆升很快。不知道這是不是表明,不少 JS/Node 愛好者開始嘗試學習 Go 了,對 Go 是好事。

大家好,我是程序員幽鬼。

Fiber 作為一個新的 Go 框架,似乎受追捧程度很高,Star 數飆升很快。不知道這是不是表明,不少 JS/Node 愛好者開始嘗試學習 Go 了,對 Go 是好事。

今天這篇文章介紹如何使用 Fiber + Gorm 構建 REST API。

1 概覽

在這篇文章中,我們將使用 Fiber[1] 框架,它使用起來非常簡單,有一個很好的抽象層,并且包含我們創建 API 所需的一切。

關于與數據庫的交互,我決定使用 ORM 來使整個過程更簡單、更直觀,因此我決定使用Gorm[2],在我看來,Gorm[3] 是 Go 世界中最受歡迎的 ORM,并且特性很多。

2 準備工作

本文基于 Go1.17.5。

在本地創建一個目錄 fibergorm,然后進入該目錄執行如下命令:

  1. $ go mod init github.com/programmerug/fibergorm 
  2. go: creating new go.mod: module github.com/programmerug/fibergorm 

接著執行如下命令,安裝我們需要的依賴:(這個先不執行,之后通過 go mod tidy 安裝)

  1. go get github.com/gofiber/fiber/v2 
  2. go get gorm.io/gorm 

為了方便,本教程中,我們使用 SQLite,因為使用了 Gorm,所以哪種關系型數據庫對核心代碼沒有什么影響。

3 開始編碼

本文以人類的朋友——狗為例。

先從定義實體開始,它總共有四個屬性:

  • Name - 狗的名字
  • Age - 狗的年齡
  • Breed - 狗的種族(類型)
  • IsGoodBoy - 狗是否是個好孩子

類似以下內容:

  1. // 文件名:entities/dog.go 
  2. package entities 
  3.  
  4. import "gorm.io/gorm" 
  5.  
  6. type Dog struct { 
  7.     gorm.Model 
  8.     Name      string `json:"name"
  9.     Age       int    `json:"age"
  10.     Breed     string `json:"breed"
  11.     IsGoodBoy bool   `json:"is_good_boy" gorm:"default:true"

注意其中的內嵌類型 gorm.Model,它只是定義了一些通用的字段。

  1. type Model struct { 
  2.     ID        uint `gorm:"primarykey"
  3.     CreatedAt time.Time 
  4.     UpdatedAt time.Time 
  5.     DeletedAt DeletedAt `gorm:"index"

因此,我們完全可以自己選擇是否要嵌入 gorm.Model。

接著,我們配置與數據庫的連接。一般我喜歡創建一個名為 Connect() 的函數,它負責初始化連接,此外還負責在我們的數據庫中執行遷移(migration),即生成表結構:

  1. // 文件名:config/database.go 
  2. package config 
  3.  
  4. import ( 
  5.     "github.com/programmerug/fibergorm/entities" 
  6.     "gorm.io/driver/sqlite" 
  7.     "gorm.io/gorm" 
  8.  
  9. var Database *gorm.DB 
  10.  
  11. func Connect() error { 
  12.     var err error 
  13.  
  14.     Database, err = gorm.Open(sqlite.Open("fibergorm.db"), &gorm.Config{}) 
  15.  
  16.     if err != nil { 
  17.         panic(err) 
  18.     } 
  19.  
  20.     Database.AutoMigrate(&entities.Dog{}) 
  21.  
  22.     return nil 
  • fibergorm.db 是最后生成的數據庫文件
  • 在程序啟動時,需要調用 Connect 函數

現在已經定義了實體并配置了到數據庫的連接,我們可以開始處理我們的處理程序。我們的每個處理程序都將對應來自 API 的一個路由,每個處理程序只負責執行一個操作。首先讓我們獲取數據庫表中的所有記錄。

  1. // 文件名:handlers/dog.go 
  2. package handlers 
  3.  
  4. import ( 
  5.     "github.com/gofiber/fiber/v2" 
  6.     "github.com/programmerug/fibergorm/config" 
  7.     "github.com/programmerug/fibergorm/entities" 
  8.  
  9. func GetDogs(c *fiber.Ctx) error { 
  10.     var dogs []entities.Dog 
  11.  
  12.     config.Database.Find(&dogs) 
  13.     return c.Status(200).JSON(dogs) 
  14.  
  15. // ... 

現在根據將在請求參數中發送的 id 參數獲取一條記錄。

  1. // 文件名:handlers/dog.go 
  2. package handlers 
  3.  
  4. // ... 
  5.  
  6. func GetDog(c *fiber.Ctx) error { 
  7.     id := c.Params("id"
  8.     var dog entities.Dog 
  9.  
  10.     result := config.Database.Find(&dog, id) 
  11.  
  12.     if result.RowsAffected == 0 { 
  13.         return c.SendStatus(404) 
  14.     } 
  15.  
  16.     return c.Status(200).JSON(&dog) 
  17.  
  18. // ... 

現在我們可以得到所有的記錄和根據 id 獲取一條記錄。但缺乏在數據庫表中插入新記錄的功能。

  1. // 文件名:handlers/dog.go 
  2. package handlers 
  3.  
  4. // ... 
  5.  
  6. func AddDog(c *fiber.Ctx) error { 
  7.     dog := new(entities.Dog) 
  8.  
  9.     if err := c.BodyParser(dog); err != nil { 
  10.         return c.Status(503).SendString(err.Error()) 
  11.     } 
  12.  
  13.     config.Database.Create(&dog) 
  14.     return c.Status(201).JSON(dog) 
  15.  
  16. // ... 

我們還需要添加更新數據庫中現有記錄的功能。與我們已經實現的類似,使用id參數來更新特定記錄。

  1. // 文件名:handlers/dog.go 
  2. package handlers 
  3.  
  4. // ... 
  5.  
  6. func UpdateDog(c *fiber.Ctx) error { 
  7.     dog := new(entities.Dog) 
  8.     id := c.Params("id"
  9.  
  10.     if err := c.BodyParser(dog); err != nil { 
  11.         return c.Status(503).SendString(err.Error()) 
  12.     } 
  13.  
  14.     config.Database.Where("id = ?", id).Updates(&dog) 
  15.     return c.Status(200).JSON(dog) 
  16.  
  17. // ... 
  18. 最后,我們需要刪除特定記錄,再次使 

最后,我們需要刪除特定記錄,再次使用 id 參數從我們的數據庫中刪除特定記錄。

  1. // 文件名:handlers/dog.go 
  2. package handlers 
  3.  
  4. // ... 
  5.  
  6. func RemoveDog(c *fiber.Ctx) error { 
  7.     id := c.Params("id"
  8.     var dog entities.Dog 
  9.  
  10.     result := config.Database.Delete(&dog, id) 
  11.  
  12.     if result.RowsAffected == 0 { 
  13.         return c.SendStatus(404) 
  14.     } 
  15.  
  16.     return c.SendStatus(200) 
  17.  
  18. // ... 

現在只需要創建我們的 main 文件,該文件將負責初始化與數據庫的連接以及我們的 API 路由將在何處定義,并且將處理程序與它們進行關聯綁定。

  1. // 文件名:main.go 
  2. package main 
  3.  
  4. import ( 
  5.     "log" 
  6.  
  7.     "github.com/gofiber/fiber/v2" 
  8.     "github.com/programmerug/fibergorm/config" 
  9.     "github.com/programmerug/fibergorm/handlers" 
  10.  
  11. func main() { 
  12.     app := fiber.New() 
  13.  
  14.     config.Connect() 
  15.  
  16.     app.Get("/dogs", handlers.GetDogs) 
  17.     app.Get("/dogs/:id", handlers.GetDog) 
  18.     app.Post("/dogs", handlers.AddDog) 
  19.     app.Put("/dogs/:id", handlers.UpdateDog) 
  20.     app.Delete("/dogs/:id", handlers.RemoveDog) 
  21.  
  22.     log.Fatal(app.Listen(":3000")) 

至此,我們完成了一個簡單應用的 CRUD。涉及到 fiber 和 gorm 的 API 你應該查閱相關文檔進一步了解。

最終,項目目錄如下:

  1. ├── config 
  2. │   └── database.go 
  3. ├── entities 
  4. │   └── dog.go 
  5. ├── fibergorm.db 
  6. ├── go.mod 
  7. ├── go.sum 
  8. ├── handlers 
  9. │   └── dog.go 
  10. └── main.go 

執行 go run main.go:

  1. $ go run main.go 
  2.  
  3.  ┌───────────────────────────────────────────────────┐ 
  4.  │                   Fiber v2.24.0                   │ 
  5.  │               http://127.0.0.1:3000               │ 
  6.  │       (bound on host 0.0.0.0 and port 3000)       │ 
  7.  │                                                   │ 
  8.  │ Handlers ............. 7  Processes ........... 1 │ 
  9.  │ Prefork ....... Disabled  PID ............. 89910 │ 
  10.  └───────────────────────────────────────────────────┘ 

借助 postman、curl 之類的工具驗證接口的正確性。

因為 fiber Ctx 的 BodyParser 能夠解析 Context-Type 值是:application/json, application/xml, application/x-www-form-urlencoded, multipart/form-data 等的數據,所以,驗證 AddDog 的可以采用你喜歡的 Content-Type。

  1. curl --location --request POST 'http://127.0.0.1:3000/dogs' \ 
  2. --header 'Content-Type: application/json' \ 
  3. --data '{name:"旺財",age:3,breed:"狼狗",is_good_boy:true}' 

可以通過下載 https://sqlitebrowser.org/dl/ 這個 SQLite 工具查看數據是否保存成功。

細心的讀者可能會發現,生成的數據表字段順序是根據 Dog 中的字段定義順序確定的。有強迫癥的人可能接受不了,因此實際中你可以不嵌入 gorm.Model,而是自己定義相關字段。

總結

本文實現了 CRUD 的功能,希望大家實際動手,這樣才能夠真正掌握。

本文參考 https://dev.to/franciscomendes10866/how-to-build-rest-api-using-go-fiber-and-gorm-orm-2jbe。

本文完整代碼:https://github.com/programmerug/fibergorm。

參考資料

[1]Fiber: https://gofiber.io/

[2]Gorm: https://gorm.io/

[3]Gorm: https://gorm.io/

 

責任編輯:武曉燕 來源: 幽鬼
相關推薦

2022-02-09 14:36:25

GoMongoDBFiber

2022-05-31 07:40:41

ArctypeFeather.jsSQLite

2023-04-18 15:18:10

2020-07-07 07:00:00

Spring WebFREST APIReactive AP

2023-09-21 11:20:46

2023-05-11 12:40:00

Spring控制器HTTP

2021-05-17 09:27:07

項目實戰優化項目構建時間

2021-12-02 16:20:18

RabbitMQAPIRest

2023-12-06 07:13:16

RESTAPI客戶端

2012-08-28 11:12:37

IBMdW

2025-02-26 09:03:24

2024-01-09 09:09:45

RESTGraphQL

2023-11-06 12:00:04

GORM

2023-11-17 12:04:39

GORM并發

2024-01-30 08:58:22

JenkinsGit流程

2013-07-18 17:00:12

Gradle構建AndAndroid開發Android學習

2023-01-10 14:11:26

2021-11-22 09:00:00

后端開發CMS

2022-07-13 15:23:57

Vue fiberreact前端

2023-11-04 15:46:03

GORMGo
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产精品成人一区二区三区夜夜夜 | 国产在线精品一区二区 | 日本一区二区三区在线观看 | 在线中文字幕av | www.4hu影院 | 国产高清精品在线 | 免费在线视频精品 | 91久久精品一区二区三区 | 精品一区在线看 | 欧美日韩综合一区 | 日本特黄a级高清免费大片 国产精品久久性 | 欧美极品在线观看 | 国产清纯白嫩初高生在线播放视频 | 国产精品免费视频一区 | 伊人春色成人网 | 成人在线免费观看 | 久久国产亚洲 | 99精品国产一区二区三区 | 亚洲日本欧美日韩高观看 | 国产精品jizz在线观看老狼 | 久久久久久久久99 | 国产小视频在线 | 天天综合天天 | 亚洲视频一区 | 亚洲一区二区三区免费视频 | 成人精品在线视频 | 免费av在线网站 | 亚洲一区二区三区四区五区中文 | 精品亚洲一区二区三区四区五区 | 九九热久久免费视频 | japanhd美女动 | 日韩精品一区二区三区中文在线 | 成人不卡| 天天看逼 | 亚洲一级二级三级 | 亚洲一区二区三区视频 | 日本免费小视频 | 免费的av网站| 国产专区在线 | 精品一区av| 国产成人精品一区 |