尝试使用 Golang Migrate 时出现错误“源驱动程序:未知驱动程序 'c'(忘记导入?)”

问题描述 投票:0回答:1

我正在尝试使用 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/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,然后使用特殊标签再次安装它,以使用命令“go install -tags 'postgres' github.com/golang-migrate/migrate/v4/cmd/migrate@latest”和“go install”来支持 postgres 驱动程序-标签“postgres,mysql”github.com/golang-migrate/migrate/v4/cmd/migrate@latest'。

但仍然遇到同样的错误。

database postgresql go migrate
1个回答
0
投票

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
了。

参考资料:

  1. 在Windows上不起作用,因为schemeFromUrl不正确地使用net/url来检查Scheme
  2. 迁移来源
© www.soinside.com 2019 - 2024. All rights reserved.