{"record":{"id":"d2f765c67bac33dc","repo":"apache/answer","slug":"insert-first-version-failed-v","errorCode":null,"errorMessage":"insert first version failed: %v","messagePattern":"insert first version failed: (.+?)","errorType":"console","errorClass":null,"httpStatus":null,"severity":"error","filePath":"internal/migrations/migrations.go","lineNumber":133,"sourceCode":"func GetMigrations() []Migration {\n\treturn migrations\n}\n\n// GetCurrentDBVersion returns the current db version\nfunc GetCurrentDBVersion(engine *xorm.Engine) (int64, error) {\n\tif err := engine.Sync(new(entity.Version)); err != nil {\n\t\treturn -1, fmt.Errorf(\"sync version failed: %v\", err)\n\t}\n\n\tcurrentVersion := &entity.Version{ID: 1}\n\thas, err := engine.Get(currentVersion)\n\tif err != nil {\n\t\treturn -1, fmt.Errorf(\"get first version failed: %v\", err)\n\t}\n\tif !has {\n\t\t_, err := engine.InsertOne(&entity.Version{ID: 1, VersionNumber: 0})\n\t\tif err != nil {\n\t\t\treturn -1, fmt.Errorf(\"insert first version failed: %v\", err)\n\t\t}\n\t\treturn 0, nil\n\t}\n\treturn currentVersion.VersionNumber, nil\n}\n\n// ExpectedVersion returns the expected db version\nfunc ExpectedVersion() int64 {\n\treturn int64(minDBVersion + len(migrations))\n}\n\n// Migrate database to current version\nfunc Migrate(debug bool, dbConf *data.Database, cacheConf *data.CacheConf, upgradeToSpecificVersion string) error {\n\tcache, cacheCleanup, err := data.NewCache(cacheConf)\n\tif err != nil {\n\t\tfmt.Println(\"new cache failed:\", err.Error())\n\t}\n\tengine, err := data.NewDB(debug, dbConf)","sourceCodeStart":115,"sourceCodeEnd":151,"githubUrl":"https://github.com/apache/answer/blob/3b9f1370612e690a0b7f230f05e688930db4c6d3/internal/migrations/migrations.go#L115-L151","documentation":"When no version row exists, GetCurrentDBVersion seeds &entity.Version{ID:1, VersionNumber:0}. If that INSERT fails, the error is wrapped as 'insert first version failed: %v', aborting migration bootstrap.","triggerScenarios":"engine.InsertOne on a fresh database fails: version table lacks ID=1 row but INSERT is denied (read-only user, insufficient privileges), duplicate key from a concurrent migration, or DB write error.","commonSituations":"Two instances running Migrate concurrently against the same fresh DB; migration user granted SELECT but not INSERT; disk full or DB in read-only mode; reserved-word or column mismatch on insert.","solutions":["Check the wrapped DB error for duplicate-key vs privilege issues","Serialize migrations (single instance / advisory lock) so only one process seeds the row","Grant INSERT privilege on the `version` table to the migration user","Manually insert the ID=1, VersionNumber=0 row if permitted, then re-run"],"exampleFix":"// before\nreturn -1, fmt.Errorf(\"insert first version failed: %v\", err)\n// after\nreturn -1, fmt.Errorf(\"insert first version failed: %w\", err)","handlingStrategy":"validation","validationCode":"// pre-check whether the version row already exists to skip seeding\nhas, _ := engine.IsTableExist(&entity.Version{})\nif has {\n    n, _ := engine.SQL(\"SELECT COUNT(*) FROM version WHERE id=1\").Count()\n    if n > 0 { /* seeding will conflict — investigate concurrent runners */ }\n}","typeGuard":null,"tryCatchPattern":"if err := runMigrations(engine); err != nil {\n    if strings.Contains(err.Error(), \"insert first version failed\") {\n        log.Errorf(\"could not seed version row; check write privileges or concurrent migration: %v\", err)\n    }\n    return err\n}","preventionTips":["Run only one migration process at a time (lock or single instance)","Grant INSERT privilege on the version table","Ensure the DB is writable (not read-only / disk not full)","Seed the version row manually only when its absence is confirmed"],"tags":["database","migration","insert-failed"],"backgroundTag":"migration-version-seed-failed","analyzedSha":"3b9f1370612e690a0b7f230f05e688930db4c6d3","analyzedAt":"2026-09-05T18:18:39.533Z","contentChangedAt":"2026-09-05T18:18:39.533Z","schemaVersion":2},"datasetVersion":"2026-09-12T22:17:10.623Z"}