簡體   English   中英

您可以將 golang-migrate 與 go 的 embed function 一起使用嗎?

[英]Can you use golang-migrate with go's embed function?

我正在嘗試使用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()
    }

NewWithDatabaseInstance的定義是:

func NewWithDatabaseInstance(sourceURL string, databaseName string, databaseInstance database.Driver) (*Migrate, error)

所以第一個參數是 URL 並且您正在傳遞腳本本身。 NewWithDatabaseInstance調用SchemeFromURL ,它會生成您所看到的錯誤(因為您傳遞的 url 不包含: )。 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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM