Heim  >  Artikel  >  Backend-Entwicklung  >  Der GORM Find(&room)-Vorgang füllt die Struktur mit leeren Daten statt mit tatsächlichen Daten

Der GORM Find(&room)-Vorgang füllt die Struktur mit leeren Daten statt mit tatsächlichen Daten

王林
王林nach vorne
2024-02-08 22:10:08901Durchsuche

GORM Find(&room) 操作用空数据而不是实际数据填充结构

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.

Frageninhalt

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.

Workaround

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:

Deba4139f5302207be648f12c74de60e

Das 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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen