You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 10:31:01