猿问

你可以使用 golang-migrate 和 go 的嵌入功能吗?

我正在尝试使用golang-migrate将 sql 文件迁移到我的 postgresql 数据库中。我可能做错了,但是当我运行迁移命令时,它说没有找到方案:


 $ go run ./cmd/  migrate

2022/04/05 16:20:29 no scheme

exit status 1


这是代码:


  // package dbschema contains the database schema, migrations, and seeding data.


    package dbschema

    

    import (

        "context"

        _ "embed" // Calls init function.

        "fmt"

        "log"

    

        "github.com/golang-migrate/migrate/v4"

        "github.com/golang-migrate/migrate/v4/database/postgres"

        "github.com/jmoiron/sqlx"

        "github.com/jonleopard/bootstrap/pkg/sys/database"

        _ "github.com/lib/pq"

    )

    

    var (

        //go:embed sql/000001_schema.up.sql

        schemaDoc string

    

        //go:embed sql/seed.sql

        seedDoc string

    )

    

    // Migrate attempts to bring the schema for db up to date with the migrations

    // defined in this package.

    func Migrate(ctx context.Context, db *sqlx.DB) error {

        if err := database.StatusCheck(ctx, db); err != nil {

            return fmt.Errorf("status check database: %w", err)

        }

    

        driver, err := postgres.WithInstance(db.DB, &postgres.Config{})

        if err != nil {

            return fmt.Errorf("Construct Migrate driver: %w", err)

        }

    

        m, err := migrate.NewWithDatabaseInstance(schemaDoc, "postgres", driver)

        if err != nil {

            log.Fatal(err)

        }

    

        return m.Up()

    }


郎朗坤
浏览 203回答 1
1回答

潇湘沐

的定义NewWithDatabaseInstance是:func NewWithDatabaseInstance(sourceURL string, databaseName string, databaseInstance database.Driver) (*Migrate, error)所以第一个参数是一个 URL,你传递的是脚本本身。NewWithDatabaseInstance调用SchemeFromURL是什么产生了你看到的错误(因为你传递的 url 不包含 a :)。一个URL包含一个“方案” :,然后是其他信息。要将 golang-migrate 与文档中embed的示例结合使用://go:embed testdata/migrations/*.sqlvar fs embed.FSfunc main() {    d, err := iofs.New(fs, "testdata/migrations")    if err != nil {        log.Fatal(err)    }    m, err := migrate.NewWithSourceInstance("iofs", d, "postgres://postgres@localhost/postgres?sslmode=disable")    if err != nil {        log.Fatal(err)    }    err = m.Up()    if err != nil {        // ...    }    // ...}您会注意到,这会传入文件夹(作为embed.FS)而不是单个文件。这是因为golang-migrate旨在应用多个迁移,而不是仅针对数据库运行单个脚本。你应该能够使用类似的东西://go:embed sql/*.sqlvar schemaFs embed.FS...d, err := iofs.New(fs, "sql") // Get migrations from sql folderif err != nil {    log.Fatal(err)}m, err := migrate.NewWithSourceInstance("iofs", d, "postgres", driver)
随时随地看视频慕课网APP

相关分类

Go
我要回答