您可以将Go-ograte与GO的嵌入功能一起使用吗?
我正在尝试使用 Golang-Origrate
将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()
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
NewWithDatabaseInstance
是:所以第一个参数是一个 URL,您正在传递脚本本身。
NewWithDatabaseInstance
调用 <一个href="https://github.com/golang-migrate/migrate/blob/331a15d92a86e002ce5043e788cc2ca287ab0cc2/internal/url/url.go#L12" rel="nofollow noreferrer">SchemeFromURL
这就是生成您所看到的错误的原因(因为您传递的网址不包含<代码>:)。 URL 由“方案”组成,后跟:
,然后其他信息。要将 golang-migrate 与
embed
结合使用,请参阅 文档中的示例:您会注意到,这传递的是一个文件夹(作为
embed.FS
)而不是单个文件。这是因为golang-migrate
旨在应用多个迁移,而不是而不是仅仅针对数据库运行单个脚本。你应该能够使用类似的东西:The definition of
NewWithDatabaseInstance
is:So the first parameter is a URL and you are passing in the script itself.
NewWithDatabaseInstance
callsSchemeFromURL
which is what generates the error you are seeing (because the url you are passing does not contain a:
). A URL consists of a "scheme" followed by:
and then other info.To use golang-migrate with
embed
see the example in the docs:You will note that this passes in a folder (as an
embed.FS
) rather than a single file. This is becausegolang-migrate
is designed to apply multiple migrations rather than just running a single script against the database. You should be able to use something like: