From b922d986d6783ce28d00ca948024dee44a11f29e Mon Sep 17 00:00:00 2001 From: Zahar Izmailov Date: Mon, 3 Feb 2025 15:36:03 +0300 Subject: Improved database model migration and added indexing (#2655) --- database/db.go | 23 +++++++++++++++++++---- database/model/model.go | 4 ++-- 2 files changed, 21 insertions(+), 6 deletions(-) (limited to 'database') diff --git a/database/db.go b/database/db.go index 1998ba23..d252cfe0 100644 --- a/database/db.go +++ b/database/db.go @@ -26,20 +26,35 @@ const ( ) func initModels() error { - models := []interface{}{ + // Order matters: first create tables without dependencies + baseModels := []interface{}{ &model.User{}, + &model.Setting{}, + } + + // Migrate base models + for _, model := range baseModels { + if err := db.AutoMigrate(model); err != nil { + log.Printf("Error auto migrating base model: %v", err) + return err + } + } + + // Then migrate models with dependencies + dependentModels := []interface{}{ &model.Inbound{}, &model.OutboundTraffics{}, - &model.Setting{}, &model.InboundClientIps{}, &xray.ClientTraffic{}, } - for _, model := range models { + + for _, model := range dependentModels { if err := db.AutoMigrate(model); err != nil { - log.Printf("Error auto migrating model: %v", err) + log.Printf("Error auto migrating dependent model: %v", err) return err } } + return nil } diff --git a/database/model/model.go b/database/model/model.go index e9d1836f..915cae0b 100644 --- a/database/model/model.go +++ b/database/model/model.go @@ -29,14 +29,14 @@ type User struct { type Inbound struct { Id int `json:"id" form:"id" gorm:"primaryKey;autoIncrement"` - UserId int `json:"-"` + UserId int `json:"-" gorm:"index"` Up int64 `json:"up" form:"up"` Down int64 `json:"down" form:"down"` Total int64 `json:"total" form:"total"` Remark string `json:"remark" form:"remark"` Enable bool `json:"enable" form:"enable"` ExpiryTime int64 `json:"expiryTime" form:"expiryTime"` - ClientStats []xray.ClientTraffic `gorm:"foreignKey:InboundId;references:Id" json:"clientStats" form:"clientStats"` + ClientStats []xray.ClientTraffic `gorm:"foreignKey:InboundId;references:Id;constraint:OnDelete:CASCADE" json:"clientStats"` // config part Listen string `json:"listen" form:"listen"` -- cgit v1.2.3