0

我有一个使用 golang-migrate/migrate 和 postgresql 数据库的简单应用程序。但是,我认为在调用Migration函数时会收到错误,因为我的 sourceURL 或 databaseURLmigrate.New()是无效的内存地址或 nil 指针。

但我不确定为什么我的 sourceURL 或 databaseURL 会导致错误 - 我将 sourceURL 存储file:///database/migration为存储我的 sql 文件的目录,databaseURL 存储postgres://postgres:postgres@127.0.0.1:5432/go_graphql?sslmode=disable在我的 Makefile 中定义的目录。

Makefile的是这样的

migrate:
    migrate -source file://database/migration \
            -database postgres://postgres:postgres@127.0.0.1:5432/go_graphql?sslmode=disable up

rollback:
    migrate -source file://database/migration \
            -database postgres://postgres:postgres@127.0.0.1:5432/go_graphql?sslmode=disable down

drop:
    migrate -source file://database/migration \
            -database postgres://postgres:postgres@127.0.0.1:5432/go_graphql?sslmode=disable drop

migration:
    migrate create -ext sql -dir database/migration go_graphql

run:
    go run main.go

然后,我main.go的如下所示。

func main() {
    ctx := context.Background()

    config := config.New()

    db := pg.New(ctx, config)
    println("HEL")

    if err := db.Migration(); err != nil {
        log.Fatal(err)
    }

    fmt.Println("Server started")
}

我打电话时出错db.Migrationmain.go

func (db *DB) Migration() error {

    m, err := migrate.New("file:///database/migration/", "postgres://postgres:postgres@127.0.0.1:5432/go_graphql?sslmode=disable"))
    println(m)
    if err != nil {
        // **I get error here!!**
        return fmt.Errorf("error happened when migration")
    }
    if err := m.Up(); err != nil && err != migrate.ErrNoChange {
        return fmt.Errorf("error when migration up: %v", err)
    }

    log.Println("migration completed!")
    return err
}

这是我的config.goDATABASE_URL与 postgres 网址相同

type database struct {
    URL string
}

type Config struct {
    Database database
}

func New() *Config {
    godotenv.Load()

    return &Config{
        Database: database{
            URL: os.Getenv("DATABASE_URL"),
        },
    }
}
4

1 回答 1

0

根据您在评论中发布的错误,error happened when migration source driver: unknown driver 'file' (forgotten import?)我可以告诉您,如前所述,您忘记了 import file

import (
  ....
  _ "github.com/golang-migrate/migrate/v4/source/file"
)

您可以在https://github.com/golang-migrate/migrate#use-in-your-go-project部分中查看示例Want to use an existing database client?

于 2021-09-05T08:48:43.550 回答