{"record":{"id":"dc6b59db8e9cdb7c","repo":"flipped-aurora/gin-vue-admin","slug":"error-dc6b59","errorCode":null,"errorMessage":"同步失败!","messagePattern":"同步失败!","errorType":"error_code","errorClass":null,"httpStatus":null,"severity":"error","filePath":"server/service/system/auto_code_package.go","lineNumber":234,"sourceCode":"\tfor i := 0; i < len(server); i++ {\n\t\tif _, ok := entitiesMap[server[i].PackageName]; !ok {\n\t\t\tif server[i].Template == \"package\" {\n\t\t\t\tcreateEntity = append(createEntity, server[i])\n\t\t\t}\n\t\t}\n\t}\n\tfor i := 0; i < len(plugin); i++ {\n\t\tif _, ok := entitiesMap[plugin[i].PackageName]; !ok {\n\t\t\tif plugin[i].Template == \"plugin\" {\n\t\t\t\tcreateEntity = append(createEntity, plugin[i])\n\t\t\t}\n\t\t}\n\t}\n\n\tif len(createEntity) > 0 {\n\t\terr = global.GVA_DB.WithContext(ctx).Create(&createEntity).Error\n\t\tif err != nil {\n\t\t\treturn nil, errors.Wrap(err, \"同步失败!\")\n\t\t}\n\t\tentities = append(entities, createEntity...)\n\t}\n\n\t// 处理数据库存在但实体文件不存在的情况 - 删除数据库中对应的数据\n\texistingPackageNames := make(map[string]bool)\n\t// 收集所有存在的包名\n\tfor i := 0; i < len(server); i++ {\n\t\texistingPackageNames[server[i].PackageName] = true\n\t}\n\tfor i := 0; i < len(plugin); i++ {\n\t\texistingPackageNames[plugin[i].PackageName] = true\n\t}\n\n\t// 找出需要删除的数据库记录\n\tdeleteEntityIDs := []uint{}\n\tfor i := 0; i < len(entities); i++ {\n\t\tif !existingPackageNames[entities[i].PackageName] {","sourceCodeStart":216,"sourceCodeEnd":252,"githubUrl":"https://github.com/flipped-aurora/gin-vue-admin/blob/3136500ef380842b0eb6c4daa87c3f8a47fcf9e0/server/service/system/auto_code_package.go#L216-L252","documentation":"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.","triggerScenarios":"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.","commonSituations":"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.","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"],"exampleFix":"// before: plain create, duplicate rows race-safe only by luck\nerr = global.GVA_DB.WithContext(ctx).Create(&createEntity).Error\n// after: tolerate concurrent sync inserts\nerr = global.GVA_DB.WithContext(ctx).\n    Clauses(clause.OnConflict{DoNothing: true}).\n    Create(&createEntity).Error","handlingStrategy":"retry","validationCode":"names := make([]string, 0, len(createEntity))\nfor _, e := range createEntity {\n    names = append(names, e.PackageName)\n}\nvar existing int64\nif err := global.GVA_DB.WithContext(ctx).\n    Model(&model.SysAutoCodePackage{}).\n    Where(\"package_name IN ?\", names).Count(&existing).Error; err != nil {\n    return fmt.Errorf(\"pre-check failed: %w\", err)\n}","typeGuard":null,"tryCatchPattern":"err = global.GVA_DB.WithContext(ctx).\n    Clauses(clause.OnConflict{DoNothing: true}).\n    Create(&createEntity).Error\nif err != nil {\n    var mysqlErr *mysql.MySQLError\n    if errors.As(err, &mysqlErr) && (mysqlErr.Number == 1213 || mysqlErr.Number == 1205) {\n        time.Sleep(time.Second)\n        err = global.GVA_DB.WithContext(ctx).Create(&createEntity).Error\n    }\n    if err != nil {\n        return nil, errors.Wrap(err, \"同步失败!\")\n    }\n}","preventionTips":["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"],"tags":["database","gorm","insert","sync","duplicate-key"],"backgroundTag":"gorm-insert-failed","analyzedSha":"3136500ef380842b0eb6c4daa87c3f8a47fcf9e0","analyzedAt":"2026-08-31T13:50:02.721Z","schemaVersion":2},"datasetVersion":"2026-08-31T19:17:28.585Z"}