From 3446394655b0034ddded1e8fb8f39dd118b313d1 Mon Sep 17 00:00:00 2001 From: Maxim Krasilnikov Date: Mon, 30 Apr 2018 12:48:58 +0300 Subject: [PATCH] Check mysql, set logger for goose, only sql format --- Makefile | 20 ++++++++++++++++++-- commands/create.go | 17 +++++++++-------- commands/down.go | 2 ++ commands/migrate/command.go | 7 ++++--- commands/redo.go | 1 + commands/reset.go | 1 + commands/seed/command.go | 7 ++++--- commands/status.go | 1 + commands/up.go | 2 ++ commands/version.go | 1 + config/viper.go | 1 + driver/goose/driver.go | 2 ++ driver/interface.go | 2 +- driver/migrate/migrator.go | 35 +++++++++++++++++++---------------- logger/zap.go | 4 ++-- main.go | 12 ++++++------ miga.yml | 14 +++++++------- utils/logger.go | 26 ++++++++++++++++++++++++++ 18 files changed, 107 insertions(+), 48 deletions(-) create mode 100644 utils/logger.go diff --git a/Makefile b/Makefile index 205d689..ce6332e 100644 --- a/Makefile +++ b/Makefile @@ -1,10 +1,26 @@ +.PHONY: postgres_up postgres_up: docker run -d \ -p 5432:5432 \ - -e POSTGRES_USER=postgres \ -e POSTGRES_DB=miga \ - -e POSTGRES_PASSWORD=postgres \ + -e POSTGRES_USER=user \ + -e POSTGRES_PASSWORD=password \ --name=miga-pg postgres:9.6.5-alpine +.PHONY: postgres_down postgres_down: docker rm -f miga-pg + +.PHONY: mysql_up +mysql_up: + docker run -d \ + -p 3306:3306 \ + -e MYSQL_DATABASE=miga \ + -e MYSQL_USER=user \ + -e MYSQL_PASSWORD=password \ + -e MYSQL_ROOT_PASSWORD=mysql \ + --name=miga-mysql mysql:5.7 + +.PHONY: mysql_down +mysql_down: + docker rm -f miga-mysql \ No newline at end of file diff --git a/commands/create.go b/commands/create.go index b4df55a..78cf2f6 100644 --- a/commands/create.go +++ b/commands/create.go @@ -7,19 +7,20 @@ import ( "gopkg.in/urfave/cli.v2" ) +// Create migrations files with given name and extension func Create(ctx *cli.Context, d driver.Interface) error { name := ctx.Args().Get(0) if len(name) == 0 { return errors.New("NAME required") } - ext := ctx.Args().Get(1) - switch ext { - case "sql": - case "go": - default: - ext = "sql" - } + // ext := ctx.Args().Get(1) + // switch ext { + // case "sql": + // case "go": + // default: + // ext = "sql" + // } - return d.Create(name, ext) + return d.Create(name, "sql") } diff --git a/commands/down.go b/commands/down.go index 818f335..9313076 100644 --- a/commands/down.go +++ b/commands/down.go @@ -5,10 +5,12 @@ import ( "gopkg.in/urfave/cli.v2" ) +// Down rollback last migration func Down(ctx *cli.Context, d driver.Interface) error { return d.Down() } +// DownTo rollback migrations one by one from current until version from command args func DownTo(ctx *cli.Context, d driver.Interface) error { version, err := parseVersion(ctx) if err != nil { diff --git a/commands/migrate/command.go b/commands/migrate/command.go index 32dd901..96781ea 100644 --- a/commands/migrate/command.go +++ b/commands/migrate/command.go @@ -9,11 +9,12 @@ import ( var migrator driver.Interface +// Command returns migration CLI command func Command() *cli.Command { return &cli.Command{ Name: "migrate", Aliases: []string{"m"}, - Usage: "migrate command", + Usage: "Migrations root command", Before: func(ctx *cli.Context) (err error) { migrator, err = driver.New(config.MigrateDriverConfig()) return @@ -21,8 +22,8 @@ func Command() *cli.Command { Subcommands: []*cli.Command{ &cli.Command{ Name: "create", - Usage: "Creates new migration file with next version", - ArgsUsage: "NAME [sql|go]", + Usage: "Creates new migration sql file", + ArgsUsage: "NAME", Action: func(ctx *cli.Context) error { return commands.Create(ctx, migrator) }, diff --git a/commands/redo.go b/commands/redo.go index f78889a..99a9ebb 100644 --- a/commands/redo.go +++ b/commands/redo.go @@ -5,6 +5,7 @@ import ( "gopkg.in/urfave/cli.v2" ) +// Redo rollback and rerun last migration func Redo(ctx *cli.Context, d driver.Interface) error { return d.Redo() } diff --git a/commands/reset.go b/commands/reset.go index 0441215..c0bc06b 100644 --- a/commands/reset.go +++ b/commands/reset.go @@ -10,6 +10,7 @@ import ( "gopkg.in/urfave/cli.v2" ) +// Reset rollback all migrations func Reset(ctx *cli.Context, d driver.Interface) error { if !ctx.Bool("force") { logger.G().Info("Rollback all migrations! Are you sure? (yes/no):") diff --git a/commands/seed/command.go b/commands/seed/command.go index a306f0b..09e94dc 100644 --- a/commands/seed/command.go +++ b/commands/seed/command.go @@ -9,11 +9,12 @@ import ( var seeder driver.Interface +// Command returns seed CLI command func Command() *cli.Command { return &cli.Command{ Name: "seed", Aliases: []string{"s"}, - Usage: "seed command", + Usage: "Seeding root command, see", Before: func(ctx *cli.Context) (err error) { seeder, err = driver.New(config.SeedDriverConfig()) return @@ -21,8 +22,8 @@ func Command() *cli.Command { Subcommands: []*cli.Command{ &cli.Command{ Name: "create", - Usage: "Creates new seed file with next version", - ArgsUsage: "NAME [sql|go]", + Usage: "Creates new seed sql file with next version", + ArgsUsage: "NAME", Action: func(ctx *cli.Context) error { return commands.Create(ctx, seeder) }, diff --git a/commands/status.go b/commands/status.go index 082ef39..1b956e2 100644 --- a/commands/status.go +++ b/commands/status.go @@ -5,6 +5,7 @@ import ( "gopkg.in/urfave/cli.v2" ) +// Status print current migrations state func Status(ctx *cli.Context, d driver.Interface) error { return d.Status() } diff --git a/commands/up.go b/commands/up.go index 29cc1d1..2f50128 100644 --- a/commands/up.go +++ b/commands/up.go @@ -5,10 +5,12 @@ import ( "gopkg.in/urfave/cli.v2" ) +// Up to latest available migration func Up(ctx *cli.Context, d driver.Interface) error { return d.Up() } +// UpTo up to version from command args func UpTo(ctx *cli.Context, d driver.Interface) error { version, err := parseVersion(ctx) if err != nil { diff --git a/commands/version.go b/commands/version.go index 606c1ac..99ca65c 100644 --- a/commands/version.go +++ b/commands/version.go @@ -5,6 +5,7 @@ import ( "gopkg.in/urfave/cli.v2" ) +// Version print current db version func Version(ctx *cli.Context, d driver.Interface) error { return d.Version() } diff --git a/config/viper.go b/config/viper.go index c524822..af9ff54 100644 --- a/config/viper.go +++ b/config/viper.go @@ -9,6 +9,7 @@ import ( var migrateConfig, seedConfig *driver.Config +// Init configuration with viper func Init(appName, cfg string) error { viper.SetConfigFile(cfg) viper.SetEnvPrefix(appName) diff --git a/driver/goose/driver.go b/driver/goose/driver.go index c67d6bc..e429b71 100644 --- a/driver/goose/driver.go +++ b/driver/goose/driver.go @@ -3,6 +3,7 @@ package goose import ( "database/sql" + "github.com/chapsuk/miga/utils" orig "github.com/pressly/goose" ) @@ -18,6 +19,7 @@ func New(dialect, dsn, tableName, dir string) (*Goose, error) { } orig.SetDBVersionTableName(tableName) + orig.SetLogger(&utils.StdLogger{}) db, err := sql.Open(dialect, dsn) if err != nil { diff --git a/driver/interface.go b/driver/interface.go index 3e5a579..115953e 100644 --- a/driver/interface.go +++ b/driver/interface.go @@ -45,6 +45,6 @@ func New(cfg *Config) (Interface, error) { cfg.Dir, ) default: - return nil, errors.New("unsupported driver") + return nil, errors.New("unsupported migrations driver") } } diff --git a/driver/migrate/migrator.go b/driver/migrate/migrator.go index 218f288..70ed2b0 100644 --- a/driver/migrate/migrator.go +++ b/driver/migrate/migrator.go @@ -2,13 +2,15 @@ package migrate import ( "database/sql" + "errors" "fmt" "strconv" - "github.com/chapsuk/miga/utils" - "github.com/chapsuk/miga/logger" + "github.com/chapsuk/miga/utils" orig "github.com/mattes/migrate" + "github.com/mattes/migrate/database" + "github.com/mattes/migrate/database/mysql" "github.com/mattes/migrate/database/postgres" _ "github.com/mattes/migrate/source/file" @@ -26,9 +28,20 @@ func New(dialect, dsn, tableName, dir string) (*Migrator, error) { return nil, err } - driver, err := postgres.WithInstance(db, &postgres.Config{ - MigrationsTable: tableName, - }) + var driver database.Driver + switch dialect { + case "postgres": + driver, err = postgres.WithInstance(db, &postgres.Config{ + MigrationsTable: tableName, + }) + case "mysql": + driver, err = mysql.WithInstance(db, &mysql.Config{ + MigrationsTable: tableName, + }) + default: + return nil, errors.New("Unsupported dialect") + } + if err != nil { return nil, err } @@ -37,7 +50,7 @@ func New(dialect, dsn, tableName, dir string) (*Migrator, error) { if err != nil { return nil, err } - m.Log = &migrateLogger{} + m.Log = &utils.StdLogger{} return &Migrator{ backend: m, @@ -132,13 +145,3 @@ func versionToUint(version string) (uint, error) { } return uint(v), nil } - -type migrateLogger struct{} - -func (l *migrateLogger) Printf(format string, v ...interface{}) { - logger.G().Infof(format, v...) -} - -func (l *migrateLogger) Verbose() bool { - return true -} diff --git a/logger/zap.go b/logger/zap.go index 202d437..8cdc6b0 100644 --- a/logger/zap.go +++ b/logger/zap.go @@ -38,8 +38,8 @@ func Init(appName, appVersion, level, format string) error { } logger = l.Sugar().With( - "app", appName, - "version", appVersion, + "app_name", appName, + "app_version", appVersion, ) return nil diff --git a/main.go b/main.go index 078626b..76a3d31 100644 --- a/main.go +++ b/main.go @@ -56,16 +56,16 @@ func main() { func initGlobalsFunc() func(*cli.Context) error { return func(ctx *cli.Context) error { - err := config.Init(ctx.App.Name, ctx.String("config")) - if err != nil { - return err - } - - return logger.Init( + err := logger.Init( ctx.App.Name, ctx.App.Version, ctx.String("log.level"), ctx.String("log.format"), ) + if err != nil { + return err + } + + return config.Init(ctx.App.Name, ctx.String("config")) } } diff --git a/miga.yml b/miga.yml index 06b0458..8dcb961 100644 --- a/miga.yml +++ b/miga.yml @@ -1,15 +1,15 @@ driver: goose -postgres: - dsn: "host=127.0.0.1 user=postgres password=postgres port=5432 sslmode=disable database=miga" +# postgres: +# dsn: "host=127.0.0.1 user=user password=password port=5432 sslmode=disable database=miga" mysql: - dsn: "" + dsn: "user:password@tcp(127.0.0.1:3306)/miga" migrate: - path: ./migrations - table_name: app_db_version + path: ./migrations/goose + table_name: db_version seed: - path: ./seeds - table_name: app_seed_version + path: ./seeds/goose + table_name: seed_version diff --git a/utils/logger.go b/utils/logger.go new file mode 100644 index 0000000..0dae8fc --- /dev/null +++ b/utils/logger.go @@ -0,0 +1,26 @@ +package utils + +import "github.com/chapsuk/miga/logger" + +type StdLogger struct{} + +func (l *StdLogger) Printf(format string, v ...interface{}) { + logger.G().Infof(format, v...) +} + +func (l *StdLogger) Verbose() bool { + return true +} + +func (l *StdLogger) Fatal(v ...interface{}) { + logger.G().Fatal(v) +} +func (l *StdLogger) Fatalf(format string, v ...interface{}) { + logger.G().Fatalf(format, v...) +} +func (l *StdLogger) Print(v ...interface{}) { + logger.G().Info(v...) +} +func (l *StdLogger) Println(v ...interface{}) { + logger.G().Info(v...) +}