Building a REST API With Go, Gin Framework, and GORM | by Carlos Armando Marcano Vargas | May, 2022

Beef up your backend tasks

I used to be on the lookout for a framework to begin a backend mission to be taught and use GORM, which is an ORM library for Go. And Gin caught my consideration, I discovered the documentation actually good with examples that assist to construct a REST API.

I wrote this text as part of my studying course of, so I’ll share with you the right way to construct a REST API utilizing Gin HTTP Internet Framework and GORM as ORM.

In line with its documentation:

Gin is an internet framework written in Go (Golang). It includes a martini-like API with efficiency that’s as much as 40 occasions quicker because of httprouter. In the event you want efficiency and good productiveness, you’ll love Gin.


  • GO put in
  • Gin framework
  • GORM

We’ll begin defining our mannequin in grocery.go:

bundle mannequin import ( 
sort Grocery struct gorm.Mannequin
Title string `json:"title"`
Amount int `json:"amount"`

Declaring gorm.Mannequin above mannequin’s fields will add these fields to the mannequin routinely if you add information to the database:

sort Mannequin struct  
ID uint `gorm:"primaryKey"`
CreatedAt time.Time
UpdatedAt time.Time
DeletedAt gorm.DeletedAt `gorm:"index"`


The database perform will join the database. I’m utilizing SQLite, however GORM has drivers for MySQL, PostgreSQL, and SQLServer. The db variable will open the database.db file the place the information might be saved.

db.AutoMigrate(&Grocery) will routinely migrate our schema, and maintain it updated.


GetGroceries is the perform that may get all of the groceries saved within the database. We declared the variable groceries after which we use the variable db to make use of the strategy Discover, related to *gorm.DB and go the deal with of groceries as an argument.

Then we use c.JSON to ship the standing and the information in groceries as JSON as a response.

GetGrocery will get you a grocery by its id. It takes the id from the URI. We use the strategy The place, to get the grocery by its id.

If an id doesn’t exist within the database, a Not Discovered standing and an error message might be despatched as a response. If it exists, then the grocery information might be despatched as a response.

We make a struct, NewGrocery, with the fields Title and Amount and we add binding: required.

After which in PostGrocery, we declare a variable grocery with NewGrocery as the kind. If one of many fields is lacking or with a typo within the put up request, a Unhealthy Request standing with an error might be despatched as a response.

If all the pieces is appropriate, like this: “title”: “Apple”, “amount”: 5. One other variable might be created, newGrocery, with Grocery as the kind.

And its information would be the similar because the grocery variable. Then we name the strategy Create, and go the deal with of newGrocery. And the standing and the information might be despatched as a response.

In UpdateGrocery, first, we test if the id passes it within the URI does exist, if it doesn’t, an error and Not Discovered standing might be despatched.

If it does exist, a variable with GroceryUpdate as the kind might be created to test the fields, if all the pieces is appropriate, then we use the strategy Updates, and ship the standing with the grocery up to date as a response.

In DeleteGrocery if the id doesn’t exist within the database, an error and a Not Discovered standing might be despatched.

If it does exist, the strategy Delete deletes the grocery. Standing and a message might be despatched as a response.


In the principle perform, we referred to as the mannequin.Database() to initialize the database.

Then we begin up our router with:

router := gin.Default()

Now we are able to use the respective HTTP strategies with their URI and features as arguments. The sample to make use of the strategies GET, POST, PUT and DELETE is similar:

    //methodology.(URI, perform)
router.GET("/groceries", grocery.GetGroceries)

Then we use the strategy Run and go the port as an argument. We will use Run with out an argument, by default it serves on :8080.

Thanks for taking your time and browse this text.

The entire code is here.

More Posts