Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Operasi Cari(&bilik) GORM mengisi struktur dengan data kosong dan bukannya data sebenar

Operasi Cari(&bilik) GORM mengisi struktur dengan data kosong dan bukannya data sebenar

王林
王林ke hadapan
2024-02-08 22:10:08901semak imbas

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

Editor PHP baru-baru ini mendapati bahawa apabila menggunakan operasi Cari(&bilik) GORM, kadangkala data kosong digunakan untuk mengisi struktur dan bukannya data sebenar. Ini boleh menyebabkan ralat atau pengecualian dalam program. Untuk menyelesaikan masalah ini, kita perlu memahami cara GORM berfungsi dan cara menggunakan operasi Cari dengan betul untuk mengisi struktur untuk mengelakkan situasi ini daripada berlaku. Dalam artikel ini, kami akan memperincikan punca masalah ini dan menyediakan penyelesaian untuk memastikan penggunaan operasi Cari GORM dengan betul.

Kandungan soalan

Saya menggunakan GORM untuk menyambung ke pangkalan data saya. Saya menggunakan GoFiber untuk aplikasi ini. Saya mempunyai dua titik akhir, GET untuk menyenaraikan semua bilik dan POST untuk membuat bilik. Saya menggunakan pemacu MySQL Gorm dan menyambung ke pangkalan data yang dihoskan oleh PlanetScale.

Model saya:-

type Room struct {
    Model
    RoomType string `json:"room_type" validate:"required"`
}

Kod titik akhir saya:-

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})
    }
}

Kod pangkalan data saya:- (dihoskan pada skala planet)

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 konsol:-

{{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 dalam pangkalan data:-

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

Keluaran 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": ""
    }
  ]
}

Kemas kini:- 20/01/2024

Kod tepat ini berfungsi apabila saya bertukar kepada pangkalan data Postgres. Jadi saya beralih kepada Postgres dan menutup tiket ini.

Penyelesaian

Saya melakukan ujian pantas menggunakan kod berikut:

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()
}

Ini yang saya dapat:

Deba4139f5302207be648f12c74de60e

Atas ialah kandungan terperinci Operasi Cari(&bilik) GORM mengisi struktur dengan data kosong dan bukannya data sebenar. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam