{"record":{"id":"66b768617ffb67f2","repo":"ent/ent","slug":"sql-schema-withmigrationmode-modereplay-requires","errorCode":null,"errorMessage":"sql/schema: WithMigrationMode(ModeReplay) requires versioned migrations: WithDir()","messagePattern":"sql/schema: WithMigrationMode\\(ModeReplay\\) requires versioned migrations: WithDir\\(\\)","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"dialect/sql/schema/atlas.go","lineNumber":587,"sourceCode":"\t\ta.diffHooks = append(a.diffHooks, withoutForeignKeys)\n\t}\n\tif a.dir != nil && a.fmt == nil {\n\t\tswitch a.dir.(type) {\n\t\tcase *sqltool.GooseDir:\n\t\t\ta.fmt = sqltool.GooseFormatter\n\t\tcase *sqltool.DBMateDir:\n\t\t\ta.fmt = sqltool.DBMateFormatter\n\t\tcase *sqltool.FlywayDir:\n\t\t\ta.fmt = sqltool.FlywayFormatter\n\t\tcase *sqltool.LiquibaseDir:\n\t\t\ta.fmt = sqltool.LiquibaseFormatter\n\t\tdefault: // migrate.LocalDir, sqltool.GolangMigrateDir and custom ones\n\t\t\ta.fmt = sqltool.GolangMigrateFormatter\n\t\t}\n\t}\n\t// ModeReplay requires a migration directory.\n\tif a.mode == ModeReplay && a.dir == nil {\n\t\treturn errors.New(\"sql/schema: WithMigrationMode(ModeReplay) requires versioned migrations: WithDir()\")\n\t}\n\treturn nil\n}\n\n// create is the Atlas engine based online migration.\nfunc (a *Atlas) create(ctx context.Context, tables ...*Table) (err error) {\n\tif a.universalID {\n\t\ttables = append(tables, NewTypesTable())\n\t}\n\tif a.driver != nil {\n\t\ta.sqlDialect, err = a.entDialect(ctx, a.driver)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t} else {\n\t\tc, err := sqlclient.OpenURL(ctx, a.url)\n\t\tif err != nil {\n\t\t\treturn err","sourceCodeStart":569,"sourceCodeEnd":605,"githubUrl":"https://github.com/ent/ent/blob/69d5d4deb19599f129166634e09d33addcf3f2cc/dialect/sql/schema/atlas.go#L569-L605","documentation":"Configuration-consistency guard in the Atlas setup: ModeReplay makes the migrator replay existing versioned files instead of computing diffs, which is only meaningful when a migration directory was supplied. The check fires when WithMigrationMode(ModeReplay) was combined with a nil a.dir (no WithDir), making replay impossible. The offending input is the mutually inconsistent option pair.","triggerScenarios":"Thrown at dialect/sql/schema/atlas.go:587 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Add WithDir(...) pointing at your versioned migration directory when using WithMigrationMode(ModeReplay).","Or drop ModeReplay and use the default (Modes of live diff/create) if you do not maintain versioned migrations."],"exampleFix":null,"handlingStrategy":"validation","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"69d5d4deb19599f129166634e09d33addcf3f2cc","analyzedAt":"2026-09-03T16:51:39.799Z","contentChangedAt":"2026-09-03T16:51:39.799Z","schemaVersion":2},"datasetVersion":"2026-09-11T00:17:11.886Z"}