我正在嘗試使用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()
}
uj5u.com熱心網友回復:
的定義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)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/457414.html
標籤:PostgreSQL 走 golang-迁移
下一篇:從地圖回傳空陣列而不是空字串陣列
