package fw import ( "database/sql" _ "github.com/lib/pq" "github.com/spf13/cobra" ) type DatabaseConfig struct { Host string User string Password string Port string Database string Migrations string } var ( step = 0 ) func GetCmdMigration(getConfig func() (*DatabaseConfig, Error)) Command { return Command{ Use: "migrate", Short: "Выполнить миграции. Подкоманды [down, create]", Run: func(cmd *cobra.Command, args []string) { conf, db, err := getConfigAndDatabase(getConfig) if err != nil { Exit(err) } err = MigrateUp(db, conf.Migrations, false) if err != nil { Exit(err) } }, Init: func(cmd *cobra.Command) { downCmd := &cobra.Command{ Use: "down", Short: "Откатить одну миграцию", Run: downCmdHandler(getConfig), } downCmd.Flags().IntVar(&step, "step", 1, "Количество отката миграции") createCmd := &cobra.Command{ Use: "create", Short: "Новая миграция", Run: createCmdHandler(getConfig), Args: cobra.ExactArgs(1), } cmd.AddCommand(downCmd, createCmd) }, } } func downCmdHandler(getConfig func() (*DatabaseConfig, Error)) func(*cobra.Command, []string) { return func(cmd *cobra.Command, args []string) { conf, db, err := getConfigAndDatabase(getConfig) if err != nil { Exit(err) } if step == 0 { step = 1 } for i := 0; i < step; i++ { err = MigrateDown(db, conf.Migrations) if err != nil { Exit(err) } } } } func createCmdHandler(getConfig func() (*DatabaseConfig, Error)) func(*cobra.Command, []string) { return func(cmd *cobra.Command, args []string) { conf, err := getConfig() if err != nil { Exit(err) } err = MigrateCreate(conf.Migrations, args[0]) if err != nil { Exit(err) } } } func getConfigAndDatabase(getConfig func() (*DatabaseConfig, Error)) (*DatabaseConfig, *sql.DB, Error) { conf, err := getConfig() if err != nil { return nil, nil, err.Tap() } db, err := CreateConnection(conf.Host, conf.Port, conf.User, conf.Password, conf.Database) if err != nil { return nil, nil, err.Tap() } return conf, db, nil }