首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >你能用go的嵌入功能来进行go迁移吗?

你能用go的嵌入功能来进行go迁移吗?
EN

Stack Overflow用户
提问于 2022-04-05 23:26:21
回答 1查看 1.2K关注 0票数 1

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

代码语言:javascript
复制
 $ go run ./cmd/  migrate
2022/04/05 16:20:29 no scheme
exit status 1

以下是代码:

代码语言:javascript
复制
  // 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()
    }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-04-06 08:00:00

NewWithDatabaseInstance的定义是:

代码语言:javascript
复制
func NewWithDatabaseInstance(sourceURL string, databaseName string, databaseInstance database.Driver) (*Migrate, error)

因此,第一个参数是URL,您正在传递脚本本身。NewWithDatabaseInstance调用SchemeFromURL,这将生成所看到的错误(因为您传递的url不包含:)。URL由一个“方案”组成,后面跟着:,然后是其他信息。

要在embed中使用golang- 文档中的示例,请参阅文档中的示例

代码语言:javascript
复制
//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被设计为应用多个迁移,而不仅仅是针对数据库运行单个脚本。您应该能够使用以下内容:

代码语言:javascript
复制
//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)
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71759491

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档