{"record":{"id":"e1274d9c38c96820","repo":"golang-migrate/migrate","slug":"no-database-name","errorCode":null,"errorMessage":"no database name","messagePattern":"no database name","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"database/spanner/spanner.go","lineNumber":37,"sourceCode":"\t\"github.com/golang-migrate/migrate/v4\"\n\t\"github.com/golang-migrate/migrate/v4/database\"\n\n\tadminpb \"cloud.google.com/go/spanner/admin/database/apiv1/databasepb\"\n\t\"google.golang.org/api/iterator\"\n)\n\nfunc init() {\n\tdb := Spanner{}\n\tdatabase.Register(\"spanner\", &db)\n}\n\n// DefaultMigrationsTable is used if no custom table is specified\nconst DefaultMigrationsTable = \"SchemaMigrations\"\n\n// Driver errors\nvar (\n\tErrNilConfig      = errors.New(\"no config\")\n\tErrNoDatabaseName = errors.New(\"no database name\")\n\tErrNoSchema       = errors.New(\"no schema\")\n\tErrDatabaseDirty  = errors.New(\"database is dirty\")\n\tErrLockHeld       = errors.New(\"unable to obtain lock\")\n\tErrLockNotHeld    = errors.New(\"unable to release already released lock\")\n)\n\n// Config used for a Spanner instance\ntype Config struct {\n\tMigrationsTable string\n\tDatabaseName    string\n\t// Whether to parse the migration DDL with spansql before\n\t// running them towards Spanner.\n\t// Parsing outputs clean DDL statements such as reformatted\n\t// and void of comments.\n\tCleanStatements bool\n}\n\n// Spanner implements database.Driver for Google Cloud Spanner","sourceCodeStart":19,"sourceCodeEnd":55,"githubUrl":"https://github.com/golang-migrate/migrate/blob/01a9643f1475e75bb6d6224ddeaf9d8e2434ca8a/database/spanner/spanner.go#L19-L55","documentation":"spanner.ErrNoDatabaseName is returned when the Spanner driver cannot determine the target database. WithInstance/WithConnection return it when Config.DatabaseName is empty, and Open returns it when the spanner:// URL lacks the database path. Spanner migrations are scoped to a specific database, so it is mandatory.","triggerScenarios":"WithInstance called with Config{DatabaseName: \"\"}; Open given a URL like 'spanner://projects/p/instances/i' with no '/databases/D' segment.","commonSituations":"Partially built spanner:// URLs missing the database component, empty env vars for the project/instance/database path, config assembled from flags where the database name was omitted.","solutions":["Provide the full database path in the URL: spanner://projects/myproj/instances/myinst/databases/mydb.","Set Config.DatabaseName to the fully qualified 'projects/.../instances/.../databases/...' string when using WithInstance.","Validate the database name/env var is non-empty before constructing the driver."],"exampleFix":"// before\ndb, err := migrate.New(\"spanner://projects/p/instances/i\", \"file://migrations\")\n// after\ndb, err := migrate.New(\"spanner://projects/p/instances/i/databases/mydb\", \"file://migrations\")","handlingStrategy":"validation","validationCode":"if cfg == nil || cfg.DatabaseName == \"\" {\n    return fmt.Errorf(\"spanner database name is required: projects/p/instances/i/databases/d\")\n}","typeGuard":"func hasDatabaseName(cfg *spanner.Config) bool { return cfg != nil && cfg.DatabaseName != \"\" }","tryCatchPattern":"if err := m.Up(); err != nil {\n    if errors.Is(err, spanner.ErrNoDatabaseName) {\n        return fmt.Errorf(\"check spanner:// URL, must end with /databases/<name>\")\n    }\n    return err\n}","preventionTips":["Store the fully qualified database path in one env var and validate it at startup.","Check the URL has the /databases/<name> segment before calling migrate.New.","Use the admin API or config validation to confirm the database exists."],"tags":["go","configuration","spanner","go-migrate"],"backgroundTag":"missing-configuration","analyzedSha":"01a9643f1475e75bb6d6224ddeaf9d8e2434ca8a","analyzedAt":"2026-09-02T19:38:29.671Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-10T02:17:09.455Z"}