Notieren Sie sich den Teil, der ein wenig untersucht wurde, z. B. die Modelldefinition mit struct
und die Migration mit AutoMigrate
.
Ich wollte in der Lage sein, beim Testen und Eingeben von Startdaten eine feste UUID anzugeben, während die automatische Generierung von UUIDs der Bibliothek überlassen wurde. Daher habe ich die folgenden Aktionen ausgeführt.
Definieren Sie zunächst das Modell in struct
package model
import (
"github.com/go-playground/validator/v10"
"github.com/google/uuid"
)
type User struct {
ID string `validate:"is_valid_uuid" gorm:"primaryKey;size:255;default:uuid_generate_v4()" json:"id"`
...
}
//Wenn die ID nicht kommt, validieren Sie sie nicht. Wenn dies der Fall ist, überprüfen Sie, ob es sich um eine UUID handelt
validate := validator.New()
validate.RegisterValidation("is_valid_uuid", isValidUUID)
func isValidUUID(fl v.FieldLevel) bool {
id := fl.Field().String()
if len(id) == 0 {
return true
}
_, err := uuid.Parse(id)
return err == nil
}
Um das obige "uuid_generate_v4 ()" zu verwenden, installieren Sie die Erweiterung "uuid-ossp" in postgres vor "AutoMigrate (& User {})"
db, err = gorm.Open("postgres", fmt.Sprintf(
"host=%s port=%s user=%s password=%s dbname=%s", host, port, user, password, dbname,
))
if err != nil {
panic(err)
}
db.Exec(`CREATE EXTENSION IF NOT EXISTS "uuid-ossp";`)
result := db.AutoMigrate(&model.User{})
...
Geben Sie den Typ mit dem Tag von struct an
type User struct {
Role string `validate:"is_valid_role" gorm:"type:role_enum;default:'user'" json:"role"`
...
}
Fügen Sie postgres vor AutoMigrate
eine Typdefinition hinzu
db.Exec(`
DO
$$
BEGIN
IF NOT EXISTS (SELECT 1 FROM pg_type WHERE typname = 'role_enum') THEN
create type role_enum AS ENUM ('admin', 'editor', 'user');
END IF;
END
$$;
`)
result := db.AutoMigrate(&model.User{})
...
Es war ein Memo über die Migration von GORM. Wenn es andere gibt, werde ich sie hinzufügen.
Recommended Posts