pink_fox/application/packages/fw/cmd_migrate.go

104 lines
2.2 KiB
Go

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
}