Skip to content

Instantly share code, notes, and snippets.

@hbjydev
Created May 24, 2024 20:02
Show Gist options
  • Save hbjydev/68a1b8cf5ecde8b73fcf6b15b7404916 to your computer and use it in GitHub Desktop.
Save hbjydev/68a1b8cf5ecde8b73fcf6b15b7404916 to your computer and use it in GitHub Desktop.
Go Migrations with embedded files
package db
import (
"embed"
"errors"
gokit_log "github.com/go-kit/log"
"github.com/go-kit/log/level"
"github.com/golang-migrate/migrate/v4"
"github.com/golang-migrate/migrate/v4/database/postgres"
_ "github.com/golang-migrate/migrate/v4/source/go_bindata"
"github.com/golang-migrate/migrate/v4/source/iofs"
_ "github.com/jackc/pgx/stdlib"
"github.com/jmoiron/sqlx"
)
//go:embed migrations/*.sql
var migrations embed.FS
type DB struct {
DB *sqlx.DB
}
func New(cfg Config, logger gokit_log.Logger) (*DB, error) {
self := &DB{ ... }
db, err := sqlx.Connect("pgx", cfg.DSN)
if err != nil {
return nil, err
}
self.DB = db
return self, nil
}
func (d *DB) Migrate() error {
migrationDriver, err := iofs.New(migrations, "migrations")
if err != nil {
return err
}
dbDriver, err := postgres.WithInstance(d.DB.DB, &postgres.Config{})
if err != nil {
return err
}
m, err := migrate.NewWithInstance(
"iofs",
migrationDriver,
"postgres",
dbDriver,
)
if err != nil {
return err
}
level.Info(d.Cfg.Log).Log("msg", "running migrations")
if err := m.Up(); err != nil {
if errors.Is(err, migrate.ErrNoChange) {
return nil
}
return err
}
return nil
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment