gogo-gormgo-fiber

GORM Find(&room) operation populating struct with null data instead of actual data


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.


Solution

  • 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"
        }
      ]
    }