github.com/dolanor/pop@v4.13.0+incompatible/soda/cmd/generate/sql_cmd.go (about)

     1  package generate
     2  
     3  import (
     4  	"context"
     5  	"errors"
     6  
     7  	"github.com/gobuffalo/attrs"
     8  	"github.com/gobuffalo/genny"
     9  	"github.com/gobuffalo/logger"
    10  	"github.com/gobuffalo/pop"
    11  	"github.com/gobuffalo/pop/genny/fizz/cempty"
    12  	"github.com/gobuffalo/pop/genny/fizz/ctable"
    13  	"github.com/spf13/cobra"
    14  )
    15  
    16  // SQLCmd generates a SQL migration
    17  var SQLCmd = &cobra.Command{
    18  	Use:   "sql [name]",
    19  	Short: "Generates Up/Down migrations for your database using SQL.",
    20  	RunE: func(cmd *cobra.Command, args []string) error {
    21  		name := ""
    22  		if len(args) > 0 {
    23  			name = args[0]
    24  		}
    25  
    26  		var (
    27  			atts attrs.Attrs
    28  			err  error
    29  		)
    30  		if len(args) > 1 {
    31  			atts, err = attrs.ParseArgs(args[1:]...)
    32  			if err != nil {
    33  				return err
    34  			}
    35  		}
    36  
    37  		run := genny.WetRunner(context.Background())
    38  
    39  		// Ensure the generator is as verbose as the old one.
    40  		lg := logger.New(logger.DebugLevel)
    41  		run.Logger = lg
    42  
    43  		p := cmd.Flag("path")
    44  		path := ""
    45  		if p != nil {
    46  			path = p.Value.String()
    47  		}
    48  		e := cmd.Flag("env")
    49  		type nameable interface {
    50  			Name() string
    51  		}
    52  		var translator nameable
    53  		db, err := pop.Connect(e.Value.String())
    54  		if err != nil {
    55  			return err
    56  		}
    57  		t := db.Dialect.FizzTranslator()
    58  		if tn, ok := t.(nameable); ok {
    59  			translator = tn
    60  		} else {
    61  			return errors.New("invalid fizz translator")
    62  		}
    63  
    64  		if len(atts) == 0 {
    65  			g, err := cempty.New(&cempty.Options{
    66  				TableName:  name,
    67  				Path:       path,
    68  				Type:       "sql",
    69  				Translator: translator,
    70  			})
    71  			if err != nil {
    72  				return err
    73  			}
    74  			run.With(g)
    75  		} else {
    76  			g, err := ctable.New(&ctable.Options{
    77  				TableName:  name,
    78  				Path:       path,
    79  				Type:       "sql",
    80  				Attrs:      atts,
    81  				Translator: t,
    82  			})
    83  			if err != nil {
    84  				return err
    85  			}
    86  			run.With(g)
    87  		}
    88  
    89  		return run.Run()
    90  	},
    91  }