| 261 | } |
| 262 | |
| 263 | func migrateDBFast() error { |
| 264 | var wg sync.WaitGroup |
| 265 | |
| 266 | migrations := []struct { |
| 267 | model interface{} |
| 268 | name string |
| 269 | }{ |
| 270 | {&Channel{}, "Channel"}, |
| 271 | {&Token{}, "Token"}, |
| 272 | {&User{}, "User"}, |
| 273 | {&Option{}, "Option"}, |
| 274 | {&Redemption{}, "Redemption"}, |
| 275 | {&Ability{}, "Ability"}, |
| 276 | {&Log{}, "Log"}, |
| 277 | {&Midjourney{}, "Midjourney"}, |
| 278 | {&TopUp{}, "TopUp"}, |
| 279 | {&QuotaData{}, "QuotaData"}, |
| 280 | {&Task{}, "Task"}, |
| 281 | {&Setup{}, "Setup"}, |
| 282 | {&UsageStatistics{}, "UsageStatistics"}, |
| 283 | {&TokenUsageLog{}, "TokenUsageLog"}, |
| 284 | } |
| 285 | // 动态计算migration数量,确保errChan缓冲区足够大 |
| 286 | errChan := make(chan error, len(migrations)) |
| 287 | |
| 288 | for _, m := range migrations { |
| 289 | wg.Add(1) |
| 290 | go func(model interface{}, name string) { |
| 291 | defer wg.Done() |
| 292 | if err := DB.AutoMigrate(model); err != nil { |
| 293 | errChan <- fmt.Errorf("failed to migrate %s: %v", name, err) |
| 294 | } |
| 295 | }(m.model, m.name) |
| 296 | } |
| 297 | |
| 298 | // Wait for all migrations to complete |
| 299 | wg.Wait() |
| 300 | close(errChan) |
| 301 | |
| 302 | // Check for any errors |
| 303 | for err := range errChan { |
| 304 | if err != nil { |
| 305 | return err |
| 306 | } |
| 307 | } |
| 308 | common.SysLog("database migrated") |
| 309 | return nil |
| 310 | } |
| 311 | |
| 312 | func migrateLOGDB() error { |
| 313 | var err error |