我正在尝试使用 Golang Migrate,但每当我尝试运行我的代码时,都会收到此错误“源驱动程序:未知驱动程序 'c'(忘记导入?)”。
我的代码:
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/golang-migrate/migrate
根据源 URL 的架构确定源驱动程序。
在您的代码中,以下源 URL 不包含有效的架构:
C:\\Users\\91790\\Documents\\Onito\\my-migrate-project\\db\\migrations
要从文件系统读取迁移源,源 URL 应以
file://
开头(架构为 file
)。分隔符也应该是斜杠 (/
)。试试这个来源网址:
file://C:/Users/91790/Documents/Onito/my-migrate-project/db/migrations
顺便说一句,
github.com/golang-migrate/migrate
是github.com/mattes/migrate
的分叉。我认为您不再需要github.com/mattes/migrate/source/file
了。
参考资料: