为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
郎朗坤 2022-11-28 10:42:24
我正在尝试使用golang-migrate将 sql 文件迁移到我的 postgresql 数据库中。我可能做错了,但是当我运行迁移命令时,它说没有找到方案: $ go run ./cmd/  migrate2022/04/05 16:20:29 no schemeexit 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()    }
查看完整描述

1 回答

?
潇湘沐

TA贡献1816条经验 获得超6个赞

的定义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/*.sql

var fs embed.FS


func 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/*.sql

var schemaFs embed.FS

...

d, err := iofs.New(fs, "sql") // Get migrations from sql folder

if err != nil {

    log.Fatal(err)

}

m, err := migrate.NewWithSourceInstance("iofs", d, "postgres", driver)


查看完整回答
反对 回复 2022-11-28
  • 1 回答
  • 0 关注
  • 202 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号