104 lines
2.2 KiB
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
|
|
}
|