github.com/yoogoc/kratos-scaffold@v0.0.0-20240402032722-a538b3c18955/project_generator/resources/cmd.migration.go.tmpl (about)

     1  {{- /*gotype: github.com/yoogoc/kratos-scaffold/project_generator.CmdTmpl*/ -}}
     2  package main
     3  
     4  import (
     5  	"{{.AppPkgPath}}/internal/conf"
     6  
     7  	"github.com/go-kratos/kratos/v2/log"
     8  	"github.com/spf13/cobra"
     9  	"github.com/pressly/goose/v3"
    10  )
    11  
    12  type MigrateCommand cobra.Command
    13  
    14  func NewMigrateCmd(logger log.Logger, conf *conf.Data) *MigrateCommand {
    15  
    16  	var table string
    17  	var dir string
    18  	var verbose bool
    19  
    20  	migrateCmd := &MigrateCommand{
    21  		Use:                "migrate",
    22  		Short:              "migrate database",
    23  		Long:               "migrate power by goose, show more in https://github.com/pressly/goose#usage",
    24  		FParseErrWhitelist: cobra.FParseErrWhitelist{UnknownFlags: true},
    25  		RunE: func(cmd *cobra.Command, args []string) error {
    26  			if verbose {
    27  				goose.SetVerbose(true)
    28  			}
    29  			goose.SetTableName(table)
    30  			if len(args) == 0 {
    31  				return cmd.Usage()
    32  			}
    33  
    34  			switch args[0] {
    35  			case "create":
    36  				return goose.Run("create", nil, dir, args[1:]...)
    37  			case "fix":
    38  				return goose.Run("fix", nil, dir)
    39  			}
    40  
    41  			command := args[0]
    42  
    43  			db, err := goose.OpenDBWithDriver(conf.Database.Driver, conf.Database.Source)
    44  			if err != nil {
    45  				log.Fatalf("db driver=%s, db string=%s: %s\n", "mysql", conf.Database.Source, err.Error())
    46  				return err
    47  			}
    48  			defer func() {
    49  				if err := db.Close(); err != nil {
    50  					log.Fatalf("goose: failed to close DB: %v\n", err)
    51  				}
    52  			}()
    53  
    54  			var arguments []string
    55  			if len(args) > 3 {
    56  				arguments = append(arguments, args[3:]...)
    57  			}
    58  
    59  			return goose.Run(command, db, dir, arguments...)
    60  		},
    61  	}
    62  
    63  	flags := (*cobra.Command)(migrateCmd).PersistentFlags()
    64  	flags.StringVarP(&dir, "dir", "", "./db/migration", "enable verbose mode")
    65  	flags.StringVarP(&table, "table", "", "goose_db_version", "migrations table name")
    66  	flags.BoolVarP(&verbose, "verbose", "v", false, "enable verbose mode")
    67  
    68  	return migrateCmd
    69  }