golang-migrate/migrate · error
database driver: unknown driver %v (forgotten import?)
Error message
database driver: unknown driver %v (forgotten import?)
What it means
database.Open looks up the registered driver by URL scheme in a global registry populated via database.Register, which drivers trigger in their package init(). If no driver is registered for the URL's scheme, this "unknown driver %v (forgotten import?)" error is returned. The message hints at the usual cause: the driver package was never imported, so its init never ran.
Source
Thrown at database/driver.go:95
// Drop deletes everything in the database.
// Note that this is a breaking action, a new call to Open() is necessary to
// ensure subsequent calls work as expected.
Drop() error
}
// Open returns a new driver instance.
func Open(url string) (Driver, error) {
scheme, err := iurl.SchemeFromURL(url)
if err != nil {
return nil, err
}
driversMu.RLock()
d, ok := drivers[scheme]
driversMu.RUnlock()
if !ok {
return nil, fmt.Errorf("database driver: unknown driver %v (forgotten import?)", scheme)
}
return d.Open(url)
}
// Register globally registers a driver.
func Register(name string, driver Driver) {
driversMu.Lock()
defer driversMu.Unlock()
if driver == nil {
panic("Register driver is nil")
}
if _, dup := drivers[name]; dup {
panic("Register called twice for driver " + name)
}
drivers[name] = driver
}
View on GitHub (pinned to 01a9643f14)
Solutions
- Add a blank import of the driver package: _ "github.com/golang-migrate/migrate/v4/database/<driver>".
- Verify the URL scheme matches a registered driver name (check the driver package's init/Register call, e.g. "postgres", "mysql", "cassandra").
- Check build tags/constraints aren't excluding the driver file from compilation, and that no import-cleanup removed the blank import.
Example fix
// before
import (
"github.com/golang-migrate/migrate/v4"
)
// after
import (
_ "github.com/golang-migrate/migrate/v4/database/postgres"
_ "github.com/golang-migrate/migrate/v4/source/file"
"github.com/golang-migrate/migrate/v4"
) Defensive patterns
Strategy: try-catch
Validate before calling
import (
_ "github.com/golang-migrate/migrate/v4/database/postgres"
_ "github.com/golang-migrate/migrate/v4/source/file"
) Try / catch
m, err := migrate.Open(dsn)
if err != nil {
if strings.Contains(err.Error(), "unknown driver") {
return fmt.Errorf("scheme %q has no registered driver; add the blank import for the driver package", schemeOf(dsn))
}
return err
} Prevention
- Always blank-import every driver and source package you use via URLs.
- Keep driver imports in a dedicated imports.go file so IDE cleanups and linters don't remove them.
- Confirm the URL scheme exactly matches the registered driver name (e.g. "postgres", not "postgresql", unless the glue package registers it).
- Check build tags when drivers appear missing only in certain builds.
When it happens
Trigger: Calling migrate.Open/database.Open with a scheme (postgres, mysql, cassandra, etc.) whose driver package (e.g. _ "github.com/golang-migrate/migrate/v4/database/postgres") is not imported; misspelled or unsupported scheme in the URL.
Common situations: Blank imports removed by an IDE auto-cleanup; using a scheme name that doesn't match the registered one (e.g. "postgresql://" when only "postgres" is registered without a glue driver); switching drivers between dev and prod without updating imports; building with build tags excluding the driver.
Related errors
AI-assisted analysis of golang-migrate/migrate@01a9643f14 (2026-09-02).
Data as JSON: /api/errors/f9b0e9d2bc83ff5f.
Report an issue: GitHub.