I am using GORM to connect to my DB. I am using GoFiber for the application. I have two endpoints, a GET to List all rooms and a POST to create a ROOM. I am using Gorm MySQL driver and connecting to a DB hosted at PlanetScale.
My Model:-
type Room struct {
Model
RoomType string `json:"room_type" validate:"required"`
}
My Get Endpoint Code:-
func GetAllRooms(c *fiber.Ctx) error {
var rooms []entities.Room
res := database.Database.Find(&rooms)
if res.RowsAffected != 0 {
return c.JSON(fiber.Map{"rooms": rooms})
} else {
return c.JSON(fiber.Map{"rooms": nil})
}
}
My Database Code:-(hosted at planetscale)
var Database *gorm.DB
func ConnectDb() {
dsn := "sample_dsn/mydatabase?tls=true&interpolateParams=true"
db, err := gorm.Open(mysql.Open(dsn))
if err != nil {
panic("Failed to connect to DB")
}
// Setup Migrations Here
db.AutoMigrate(&entities.Booking{})
db.AutoMigrate(&entities.Inventory{})
db.AutoMigrate(&entities.Room{})
db.AutoMigrate(&entities.User{})
Database = db
}
Output In Console:-
{{1 0001-01-01 00:00:00 +0000 UTC 0001-01-01 00:00:00 +0000 UTC {0001-01-01 00:00:00 +0000 UTC false}} }
{{2 0001-01-01 00:00:00 +0000 UTC 0001-01-01 00:00:00 +0000 UTC {0001-01-01 00:00:00 +0000 UTC false}} }
{{3 0001-01-01 00:00:00 +0000 UTC 0001-01-01 00:00:00 +0000 UTC {0001-01-01 00:00:00 +0000 UTC false}} }
{{4 0001-01-01 00:00:00 +0000 UTC 0001-01-01 00:00:00 +0000 UTC {0001-01-01 00:00:00 +0000 UTC false}} }
Data in DB:-
id created_at updated_at deleted_at **room_type**
1 2024-01-18 19:27:36.680 2024-01-18 19:27:36.680 DOUBLE_ROOM
2 2024-01-18 19:27:41.206 2024-01-18 19:27:41.206 DOUBLE_ROOM
3 2024-01-18 19:27:49.403 2024-01-18 19:27:49.403 KING_SIZE_AC
4 2024-01-19 11:06:11.789 2024-01-19 11:06:11.789 DOUBLE_BED
API Output:-
{
"rooms": [
{
"ID": 1,
"CreatedAt": "0001-01-01T00:00:00Z",
"UpdatedAt": "0001-01-01T00:00:00Z",
"DeletedAt": null,
"room_type": ""
},
{
"ID": 2,
"CreatedAt": "0001-01-01T00:00:00Z",
"UpdatedAt": "0001-01-01T00:00:00Z",
"DeletedAt": null,
"room_type": ""
},
{
"ID": 3,
"CreatedAt": "0001-01-01T00:00:00Z",
"UpdatedAt": "0001-01-01T00:00:00Z",
"DeletedAt": null,
"room_type": ""
},
{
"ID": 4,
"CreatedAt": "0001-01-01T00:00:00Z",
"UpdatedAt": "0001-01-01T00:00:00Z",
"DeletedAt": null,
"room_type": ""
}
]
}
Update:- 01/20/2024
This exact code works when I switch to Postgres Database. So I am switching to Postgres and closing this ticket.
I made a quick test with the below code:
package main
import (
"github.com/gofiber/fiber/v2"
"gorm.io/driver/postgres"
"gorm.io/gorm"
"log"
)
var (
dsn = "host=localhost user=postgres password=secret dbname=mySampleDb port=5432 sslmode=disable"
)
type Room struct {
gorm.Model
RoomType string `json:"room_type" validate:"required"`
}
var DB *gorm.DB
func main() {
initDb()
app := fiber.New()
app.Get("/", getAllRoomsForFiber)
app.Listen(":3000")
}
func getAllRoomsForFiber(c *fiber.Ctx) error {
var rooms []Room
res := DB.Find(&rooms)
if res.RowsAffected != 0 {
return c.JSON(fiber.Map{"rooms": rooms})
} else {
return c.JSON(fiber.Map{"rooms": nil})
}
}
func seedDb() {
DB.Create(&Room{RoomType: "single"})
DB.Create(&Room{RoomType: "Deluxe bed"})
DB.Create(&Room{RoomType: "Twin bed"})
DB.Create(&Room{RoomType: "King Size bed"})
}
func initDb() {
db, err := gorm.Open(postgres.Open(dsn))
if err != nil {
log.Fatal("couldn't connect to db")
}
DB = db
db.AutoMigrate(&Room{})
seedDb()
}
And this is what I get:
{
"rooms":[
{
"ID":1,
"CreatedAt":"2024-01-19T15:54:10.19868+03:00",
"UpdatedAt":"2024-01-19T15:54:10.19868+03:00",
"DeletedAt":null,
"room_type":"single"
},
{
"ID":2,
"CreatedAt":"2024-01-19T15:54:10.199816+03:00",
"UpdatedAt":"2024-01-19T15:54:10.199816+03:00",
"DeletedAt":null,
"room_type":"King Size Bed"
},
{
"ID":3,
"CreatedAt":"2024-01-19T15:55:07.110176+03:00",
"UpdatedAt":"2024-01-19T15:55:07.110176+03:00",
"DeletedAt":null,
"room_type":"Twin Bed"
},
{
"ID":4,
"CreatedAt":"2024-01-19T15:55:07.115137+03:00",
"UpdatedAt":"2024-01-19T15:55:07.115137+03:00",
"DeletedAt":null,
"room_type":"Deluxe bed"
}
]
}