package main import ( "database/sql" "fmt" "github.com/golang-migrate/migrate/v4" "github.com/golang-migrate/migrate/v4/database/sqlite" _ "github.com/golang-migrate/migrate/v4/source/file" _ "github.com/mattn/go-sqlite3" "github.com/pkg/errors" "github.com/spf13/cobra" ) var rootCmd = &cobra.Command{ Use: "allredlib", Short: "allredlib - a CLI for managing and running a home library", Run: func(cmd *cobra.Command, args []string) { fmt.Println("try running one of my subcommands") }, } var migrateUp = &cobra.Command{ Use: "migrate-up", Short: "add all the migrations", RunE: func(cmd *cobra.Command, args []string) error { files, err := cmd.Flags().GetString("files") if err != nil { return errors.Wrap(err, "could not get files arg") } if files == "" { return fmt.Errorf("Expected files to be defined, but it was not") } connection, err := cmd.Flags().GetString("connection") if err != nil { return errors.Wrap(err, "could not get connection arg") } if connection == "" { return fmt.Errorf("Expected connection to be defined, but it was not") } db, err := sql.Open("sqlite3", connection+"?_pragma=foreign_keys(1)") if err != nil { return errors.Wrap(err, "failed to connect to DB") } driver, err := sqlite.WithInstance(db, &sqlite.Config{}) m, err := migrate.NewWithDatabaseInstance( fmt.Sprintf("file:///%s", files), "postgres", driver) if err != nil { return errors.Wrap(err, "failed to connect to DB") } err = m.Up() if err != nil { if errors.Is(err, migrate.ErrNoChange) { fmt.Println("nothing to migrate") return nil } return err } fmt.Println("migrated up") return nil }, } var migrateDown = &cobra.Command{ Use: "migrate-down", Short: "remove all the migrations", RunE: func(cmd *cobra.Command, args []string) error { files, err := cmd.Flags().GetString("files") if err != nil { return errors.Wrap(err, "could not get files arg") } if files == "" { return fmt.Errorf("Expected files to be defined, but it was not") } connection, err := cmd.Flags().GetString("connection") if err != nil { return errors.Wrap(err, "could not get connection arg") } if connection == "" { return fmt.Errorf("Expected connection to be defined, but it was not") } db, err := sql.Open("sqlite3", connection) if err != nil { return errors.Wrap(err, "failed to connect to DB") } driver, err := sqlite.WithInstance(db, &sqlite.Config{}) m, err := migrate.NewWithDatabaseInstance( fmt.Sprintf("file:///%s", files), "postgres", driver) if err != nil { return errors.Wrap(err, "failed to connect to DB 2") } err = m.Down() if err != nil { if errors.Is(err, migrate.ErrNoChange) { fmt.Println("nothing to migrate") return nil } return err } fmt.Println("migrated down") return nil }, } func init() { migrateUp.Flags().String("files", "", "path to migration files") migrateUp.Flags().String("connection", "", "connection to DB") rootCmd.AddCommand(migrateUp) migrateDown.Flags().String("files", "", "path to migration files") migrateDown.Flags().String("connection", "", "connection to DB") rootCmd.AddCommand(migrateDown) } func main() { rootCmd.Execute() }