Der PHP-Editor hat kürzlich entdeckt, dass bei der Verwendung der Find(&room)-Operation von GORM manchmal leere Daten anstelle tatsächlicher Daten zum Füllen der Struktur verwendet werden. Dies kann zu Fehlern oder Ausnahmen im Programm führen. Um dieses Problem zu lösen, müssen wir verstehen, wie GORM funktioniert und wie man die Suchoperation richtig verwendet, um die Struktur zu füllen, um diese Situation zu vermeiden. In diesem Artikel werden wir die Ursache dieses Problems detailliert beschreiben und Lösungen bereitstellen, um die korrekte Verwendung des Suchvorgangs von GORM sicherzustellen.
Ich verwende GORM, um eine Verbindung zu meiner Datenbank herzustellen. Ich verwende GoFiber für diese Anwendung. Ich habe zwei Endpunkte, einen GET zum Auflisten aller Räume und einen POST zum Erstellen von Räumen. Ich verwende den Gorm MySQL-Treiber und verbinde mich mit einer von PlanetScale gehosteten Datenbank.
Mein Modell:-
type Room struct { Model RoomType string `json:"room_type" validate:"required"` }
Mein Endpunktcode abrufen:-
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}) } }
Mein Datenbankcode:- (gehostet bei 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 }
Konsolenausgabe:-
{{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}} }
Daten in der Datenbank:-
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-Ausgabe:-
{ "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:- 20.01.2024
Dieser genaue Code funktioniert, wenn ich zu einer Postgres-Datenbank wechsle. Also bin ich zu Postgres gewechselt und habe dieses Ticket geschlossen.
Ich habe einen Schnelltest mit dem folgenden Code durchgeführt:
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() }
Das habe ich bekommen:
Deba4139f5302207be648f12c74de60eDas obige ist der detaillierte Inhalt vonDer GORM Find(&room)-Vorgang füllt die Struktur mit leeren Daten statt mit tatsächlichen Daten. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!