使用Golang Migrate报错:source driver: unknown driver 'c' 求助
使用Golang Migrate进行数据库迁移时持续遇到错误:
source driver: unknown driver 'c' (forgotten import?) 代码示例
main.go
package main import ( _ "github.com/golang-migrate/migrate/v4/source/file" _ "github.com/mattes/migrate/source/file" "log" "database/sql" "fmt" "my-migrate-project/db" "os" ) func main() { dbURL := "postgres://postgres:password@localhost:5432/TestDb?sslmode=disable" // Open a connection using the database/sql package sqlDB, err := db.OpenDB(dbURL) if err != nil { log.Fatal("Error opening database connection:", err) } defer sqlDB.Close() // Before Migrate Operations if err := beforeMigrationTxns(sqlDB); err != nil { log.Fatal("Error during transactions before migration:", err) } // Migrate the database if err := db.Migrate(sqlDB); err != nil { fmt.Println("Error during migration:", err) // Rollback in case of migration error if rollbackErr := db.Rollback(sqlDB); rollbackErr != nil { fmt.Println("Error during rollback:", rollbackErr) } } else { fmt.Println("Migration successful") // After Migrate Operations if err := afterMigrationTxns(sqlDB); err != nil { log.Fatal("Error during transactions after migration:", err) } } } func beforeMigrationTxns(sqlDB *sql.DB) error { fmt.Println("Performing custom transactions before migration") // Read custom SQL queries from file queryFile := "db/migrations/custom_queries_1.sql" queries, err := os.ReadFile(queryFile) if err != nil { return err } // Execute custom queries _, err = sqlDB.Exec(string(queries)) if err != nil { return err } return nil } func afterMigrationTxns(sqlDB *sql.DB) error { fmt.Println("Performing custom transactions after migration") // Read custom SQL queries from file queryFile := "db/migrations/custom_queries_2.sql" queries, err := os.ReadFile(queryFile) if err != nil { return err } // Execute custom queries _, err = sqlDB.Exec(string(queries)) if err != nil { return err } return nil }
db.go
package db import ( "github.com/golang-migrate/migrate/v4" _ "github.com/golang-migrate/migrate/v4/source/file" _ "github.com/mattes/migrate/source/file" "database/sql" "fmt" pgmigrate "github.com/golang-migrate/migrate/v4/database/postgres" ) // OpenDB opens a PostgreSQL database connection using go-pg func OpenDB(dbURL string) (*sql.DB, error) { db, err := sql.Open("postgres", dbURL) if err != nil { return nil, err } return db, nil } func Migrate(sqlDB *sql.DB) error { // Create a new migration driver instance for PostgreSQL driver, err := pgmigrate.WithInstance(sqlDB, &pgmigrate.Config{}) if err != nil { return err } m, err := migrate.NewWithDatabaseInstance( "C:\\Users\\91790\\Documents\\Onito\\my-migrate-project\\db\\migrations", "postgres", driver) if err != nil { return err } // 'Up' method applies all migrations that have not been applied yet // Checks if there is any general error during the migration process // ErrNoChange is a specific error returned when there are no new migrations to apply. // In such a case, it doesn't indicate a failure but rather that there were no changes to be made. if err := m.Up(); err != nil && err != migrate.ErrNoChange { return err } fmt.Println("Migration successful") return nil } // Rollback rolls back the last PostgreSQL database migration func Rollback(sqlDB *sql.DB) error { // Create a new migration driver instance for PostgreSQL driver, err := pgmigrate.WithInstance(sqlDB, &pgmigrate.Config{}) if err != nil { return err } // Create a new migration instance with the PostgreSQL driver m, err := migrate.NewWithDatabaseInstance( "C:\\Users\\91790\\Documents\\Onito\\my-migrate-project\\db\\migrations", "postgres", driver) if err != nil { return err } // Force method to set the version to 0, effectively rolling back to the initial version if err := m.Force(0); err != nil { return err } // Print a success message if the rollback is successful fmt.Println("Rollback successful") // Return nil to indicate success return nil }
已尝试的解决方案(未解决)
- 将
github.com/mattes/migrate/source/file优先导入 - 执行命令
set CGO_ENABLED=1启用CGO标志 - 使用命令
go install -tags 'postgres' github.com/golang-migrate/migrate/v4/cmd/migrate@latest安装Postgres驱动 - 卸载并重新安装Golang Migrate,添加postgres、mysql标签以支持对应驱动
内容的提问来源于stack exchange,提问作者prag-sri
相关产品推荐
相关产品推荐

