Heim > Backend-Entwicklung > Golang > 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

王林
Freigeben: 2024-02-08 22:10:08
nach vorne
953 Leute haben es durchsucht

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"`
}
Nach dem Login kopieren

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})
    }
}
Nach dem Login kopieren

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
}
Nach dem Login kopieren

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}} }
Nach dem Login kopieren

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
Nach dem Login kopieren

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": ""
    }
  ]
}
Nach dem Login kopieren

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()
}
Nach dem Login kopieren

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!

Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage