flipped-aurora/gin-vue-admin · error

sys_timed_tasks表数据初始化失败!

Error message

sys_timed_tasks表数据初始化失败!

What it means

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.

Source

Thrown at server/source/system/timed_task.go:53

	if !ok {
		return false
	}
	m := db.Migrator()
	return m.HasTable(&sysModel.SysTimedTask{}) && m.HasTable(&sysModel.SysTimedTaskLog{})
}

// InitializeData 吃狗粮: 原 initialize/timer.go 两条硬编码任务迁为种子, 由面板接管
func (i *initTimedTask) InitializeData(ctx context.Context) (context.Context, error) {
	db, ok := ctx.Value("db").(*gorm.DB)
	if !ok {
		return ctx, system.ErrMissingDBContext
	}
	entities := []sysModel.SysTimedTask{
		{Name: "ClearDB", Description: "定时清理数据库过期日志(操作记录/JWT黑名单/定时任务执行日志)", Spec: "@daily", ExecutorType: sysModel.TimedTaskExecutorMethod, MethodName: "ClearDB", Enabled: true},
		{Name: "CleanStaleUploads", Description: "定时清理过期大文件上传会话", Spec: "@hourly", ExecutorType: sysModel.TimedTaskExecutorMethod, MethodName: "CleanStaleUploads", Enabled: true},
	}
	if err := db.Create(&entities).Error; err != nil {
		return ctx, errors.Wrap(err, sysModel.SysTimedTask{}.TableName()+"表数据初始化失败!")
	}
	next := context.WithValue(ctx, i.InitializerName(), entities)
	return next, nil
}

func (i *initTimedTask) DataInserted(ctx context.Context) bool {
	db, ok := ctx.Value("db").(*gorm.DB)
	if !ok {
		return false
	}
	if errors.Is(db.Where("name = ?", "ClearDB").First(&sysModel.SysTimedTask{}).Error, gorm.ErrRecordNotFound) {
		return false
	}
	return true
}

View on GitHub (pinned to 3136500ef3)

Solutions

  1. Check the wrapped cause for the exact SQL error (duplicate key vs missing table)
  2. Run db.AutoMigrate(&sysModel.SysTimedTask{}) before initialization
  3. Only seed when DataInserted(ctx) reports no tasks, or clean sys_timed_tasks first
  4. Verify DB connectivity/credentials and write permissions
  5. Confirm ExecutorType/Spec values fit the column types for your dialect

Example fix

// before: re-init duplicates ClearDB and fails
ctx, err = initTimedTask{}.InitializeData(ctx)
// after: seed only if empty
var count int64
_ = db.Model(&sysModel.SysTimedTask{}).Count(&count).Error
if count == 0 {
    if err := db.AutoMigrate(&sysModel.SysTimedTask{}); err != nil { return err }
    ctx, err = initTimedTask{}.InitializeData(ctx)
}
Defensive patterns

Strategy: validation

Validate before calling

if !db.Migrator().HasTable(&sysModel.SysTimedTask{}) {
    if err := db.AutoMigrate(&sysModel.SysTimedTask{}); err != nil { return err }
}
var count int64
if err := db.Model(&sysModel.SysTimedTask{}).Count(&count).Error; err != nil { return err }
if count > 0 { return nil } // tasks already seeded

Type guard

func hasDB(ctx context.Context) (*gorm.DB, bool) {
    db, ok := ctx.Value("db").(*gorm.DB)
    return db, ok && db != nil
}

Try / catch

ctx, err = initTimedTask{}.InitializeData(ctx)
if err != nil {
    log.Printf("timed task seed failed: %v (cause: %v)", err, errors.Cause(err))
    return err
}

Prevention

When it happens

Trigger: 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.

Common situations: 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.

Related errors


AI-assisted analysis of flipped-aurora/gin-vue-admin@3136500ef3 (2026-08-31). Data as JSON: /api/errors/5f0148939f05e62b. Report an issue: GitHub.