L'éditeur de PHP a récemment découvert que lors de l'utilisation de l'opération Find(&room) de GORM, des données vides sont parfois utilisées pour remplir la structure au lieu de données réelles. Cela peut provoquer des erreurs ou des exceptions dans le programme. Afin de résoudre ce problème, nous devons comprendre comment fonctionne GORM et comment utiliser correctement l'opération Find pour remplir la structure afin d'éviter que cette situation ne se produise. Dans cet article, nous détaillerons la cause de ce problème et proposerons des solutions pour garantir une utilisation correcte de l'opération Find de GORM.
J'utilise GORM pour me connecter à ma base de données. J'utilise GoFiber pour cette application. J'ai deux points de terminaison, un GET pour lister toutes les pièces et un POST pour créer des pièces. J'utilise le pilote Gorm MySQL et je me connecte à une base de données hébergée par PlanetScale.
Mon modèle :-
type Room struct { Model RoomType string `json:"room_type" validate:"required"` }
Mon code de point de terminaison :-
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}) } }
Code de ma base de données : - (hébergée à l'échelle planétaire)
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 }
Sortie 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}} }
Données dans la base de données :-
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
Sortie API :-
{ "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": "" } ] }
Mise à jour :- 20/01/2024
Ce code exact fonctionne lorsque je passe à une base de données Postgres. Je suis donc passé à Postgres et j'ai fermé ce ticket.
J'ai fait un test rapide en utilisant le code suivant :
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() }
Voici ce que j'ai obtenu :
Deba4139f5302207be648f12c74de60eCe qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!