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.
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.
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:
Deba4139f5302207be648f12c74de60eAtas 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!