{"record":{"id":"5f0148939f05e62b","repo":"flipped-aurora/gin-vue-admin","slug":"sys-timed-tasks","errorCode":null,"errorMessage":"sys_timed_tasks表数据初始化失败!","messagePattern":"sys_timed_tasks表数据初始化失败!","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"server/source/system/timed_task.go","lineNumber":53,"sourceCode":"\tif !ok {\n\t\treturn false\n\t}\n\tm := db.Migrator()\n\treturn m.HasTable(&sysModel.SysTimedTask{}) && m.HasTable(&sysModel.SysTimedTaskLog{})\n}\n\n// InitializeData 吃狗粮: 原 initialize/timer.go 两条硬编码任务迁为种子, 由面板接管\nfunc (i *initTimedTask) InitializeData(ctx context.Context) (context.Context, error) {\n\tdb, ok := ctx.Value(\"db\").(*gorm.DB)\n\tif !ok {\n\t\treturn ctx, system.ErrMissingDBContext\n\t}\n\tentities := []sysModel.SysTimedTask{\n\t\t{Name: \"ClearDB\", Description: \"定时清理数据库过期日志(操作记录/JWT黑名单/定时任务执行日志)\", Spec: \"@daily\", ExecutorType: sysModel.TimedTaskExecutorMethod, MethodName: \"ClearDB\", Enabled: true},\n\t\t{Name: \"CleanStaleUploads\", Description: \"定时清理过期大文件上传会话\", Spec: \"@hourly\", ExecutorType: sysModel.TimedTaskExecutorMethod, MethodName: \"CleanStaleUploads\", Enabled: true},\n\t}\n\tif err := db.Create(&entities).Error; err != nil {\n\t\treturn ctx, errors.Wrap(err, sysModel.SysTimedTask{}.TableName()+\"表数据初始化失败!\")\n\t}\n\tnext := context.WithValue(ctx, i.InitializerName(), entities)\n\treturn next, nil\n}\n\nfunc (i *initTimedTask) DataInserted(ctx context.Context) bool {\n\tdb, ok := ctx.Value(\"db\").(*gorm.DB)\n\tif !ok {\n\t\treturn false\n\t}\n\tif errors.Is(db.Where(\"name = ?\", \"ClearDB\").First(&sysModel.SysTimedTask{}).Error, gorm.ErrRecordNotFound) {\n\t\treturn false\n\t}\n\treturn true\n}\n","sourceCodeStart":35,"sourceCodeEnd":69,"githubUrl":"https://github.com/flipped-aurora/gin-vue-admin/blob/3136500ef380842b0eb6c4daa87c3f8a47fcf9e0/server/source/system/timed_task.go#L35-L69","documentation":"Thrown by the timed-task initializer (initTimedTask.InitializeData) when the bulk insert of the two default tasks (ClearDB @daily, CleanStaleUploads @hourly) into sys_timed_tasks fails. It wraps the raw GORM error and names the table. These seed rows drive the built-in cron jobs after startup.","triggerScenarios":"db.Create(&entities) returns an error: sys_timed_tasks not migrated, duplicate task Name/MethodName from prior seeding, enum/type mismatch on ExecutorType or Spec column, or DB connection failure during insert.","commonSituations":"Initialization re-run on an already-seeded DB (duplicate ClearDB row); schema change between versions where the tasks table gained constraints; DB user lacks INSERT privilege; sqlite test DB locked concurrently.","solutions":["Check the wrapped cause for the exact SQL error (duplicate key vs missing table)","Run db.AutoMigrate(&sysModel.SysTimedTask{}) before initialization","Only seed when DataInserted(ctx) reports no tasks, or clean sys_timed_tasks first","Verify DB connectivity/credentials and write permissions","Confirm ExecutorType/Spec values fit the column types for your dialect"],"exampleFix":"// before: re-init duplicates ClearDB and fails\nctx, err = initTimedTask{}.InitializeData(ctx)\n// after: seed only if empty\nvar count int64\n_ = db.Model(&sysModel.SysTimedTask{}).Count(&count).Error\nif count == 0 {\n    if err := db.AutoMigrate(&sysModel.SysTimedTask{}); err != nil { return err }\n    ctx, err = initTimedTask{}.InitializeData(ctx)\n}","handlingStrategy":"validation","validationCode":"if !db.Migrator().HasTable(&sysModel.SysTimedTask{}) {\n    if err := db.AutoMigrate(&sysModel.SysTimedTask{}); err != nil { return err }\n}\nvar count int64\nif err := db.Model(&sysModel.SysTimedTask{}).Count(&count).Error; err != nil { return err }\nif count > 0 { return nil } // tasks already seeded","typeGuard":"func hasDB(ctx context.Context) (*gorm.DB, bool) {\n    db, ok := ctx.Value(\"db\").(*gorm.DB)\n    return db, ok && db != nil\n}","tryCatchPattern":"ctx, err = initTimedTask{}.InitializeData(ctx)\nif err != nil {\n    log.Printf(\"timed task seed failed: %v (cause: %v)\", err, errors.Cause(err))\n    return err\n}","preventionTips":["Guard with DataInserted so ClearDB/CleanStaleUploads are never duplicated","AutoMigrate the tasks table before init","Keep Spec/ExecutorType values compatible with your dialect's column types","Run init once per database; avoid concurrent init processes"],"tags":["gorm","database","cron","seed-data","initialization"],"backgroundTag":"seed-data-insert-failed","analyzedSha":"3136500ef380842b0eb6c4daa87c3f8a47fcf9e0","analyzedAt":"2026-08-31T13:50:02.721Z","schemaVersion":2},"datasetVersion":"2026-08-31T19:17:28.585Z"}