flipped-aurora/gin-vue-admin · error
同步失败!
Error message
同步失败!
What it means
During reconciliation, All inserts any directories discovered on disk that have no DB record (createEntity). This error wraps a failed batch INSERT of those new package rows, so the filesystem-to-database sync aborts.
Source
Thrown at server/service/system/auto_code_package.go:234
for i := 0; i < len(server); i++ {
if _, ok := entitiesMap[server[i].PackageName]; !ok {
if server[i].Template == "package" {
createEntity = append(createEntity, server[i])
}
}
}
for i := 0; i < len(plugin); i++ {
if _, ok := entitiesMap[plugin[i].PackageName]; !ok {
if plugin[i].Template == "plugin" {
createEntity = append(createEntity, plugin[i])
}
}
}
if len(createEntity) > 0 {
err = global.GVA_DB.WithContext(ctx).Create(&createEntity).Error
if err != nil {
return nil, errors.Wrap(err, "同步失败!")
}
entities = append(entities, createEntity...)
}
// 处理数据库存在但实体文件不存在的情况 - 删除数据库中对应的数据
existingPackageNames := make(map[string]bool)
// 收集所有存在的包名
for i := 0; i < len(server); i++ {
existingPackageNames[server[i].PackageName] = true
}
for i := 0; i < len(plugin); i++ {
existingPackageNames[plugin[i].PackageName] = true
}
// 找出需要删除的数据库记录
deleteEntityIDs := []uint{}
for i := 0; i < len(entities); i++ {
if !existingPackageNames[entities[i].PackageName] {View on GitHub (pinned to 3136500ef3)
Solutions
- Check the wrapped inner error for duplicate-key or connection issues
- Handle unique conflicts gracefully (upsert via clause.OnConflict or check existence before insert) to avoid races
- Ensure sys_auto_code_packages is migrated
- Trim package directory names to fit the column size
Example fix
// before: plain create, duplicate rows race-safe only by luck
err = global.GVA_DB.WithContext(ctx).Create(&createEntity).Error
// after: tolerate concurrent sync inserts
err = global.GVA_DB.WithContext(ctx).
Clauses(clause.OnConflict{DoNothing: true}).
Create(&createEntity).Error Defensive patterns
Strategy: retry
Validate before calling
names := make([]string, 0, len(createEntity))
for _, e := range createEntity {
names = append(names, e.PackageName)
}
var existing int64
if err := global.GVA_DB.WithContext(ctx).
Model(&model.SysAutoCodePackage{}).
Where("package_name IN ?", names).Count(&existing).Error; err != nil {
return fmt.Errorf("pre-check failed: %w", err)
} Try / catch
err = global.GVA_DB.WithContext(ctx).
Clauses(clause.OnConflict{DoNothing: true}).
Create(&createEntity).Error
if err != nil {
var mysqlErr *mysql.MySQLError
if errors.As(err, &mysqlErr) && (mysqlErr.Number == 1213 || mysqlErr.Number == 1205) {
time.Sleep(time.Second)
err = global.GVA_DB.WithContext(ctx).Create(&createEntity).Error
}
if err != nil {
return nil, errors.Wrap(err, "同步失败!")
}
} Prevention
- Use upsert (OnConflict) for filesystem-to-DB sync to survive concurrent runs
- Run migrations so the table and its constraints exist
- Keep directory names within DB column length limits
- Avoid triggering sync concurrently from multiple instances, or add a sync lock
When it happens
Trigger: Calling autoCodePackage.All when new package directories exist on disk and the batch Create fails — DB connection dropped, table missing, duplicate package_name violating a unique index, or field value exceeding column size.
Common situations: Unique constraint on package_name violated by a race (another request synced the same dir concurrently); missing migration in fresh env; DB outage during scan-and-sync; oversized template/package name beyond column length.
Related errors
AI-assisted analysis of flipped-aurora/gin-vue-admin@3136500ef3 (2026-08-31).
Data as JSON: /api/errors/dc6b59db8e9cdb7c.
Report an issue: GitHub.