package main import ( "flag" "log" "os" "github.com/pressly/goose" // Init DB drivers. _ "github.com/go-sql-driver/mysql" _ "github.com/lib/pq" _ "github.com/mattn/go-sqlite3" _ "github.com/ziutek/mymysql/godrv" ) var ( flags = flag.NewFlagSet("goose", flag.ExitOnError) dir = flags.String("dir", ".", "directory with migration files") ) func main() { flags.Usage = usage flags.Parse(os.Args[1:]) args := flags.Args() if len(args) == 0 || args[0] == "-h" || args[0] == "--help" { flags.Usage() return } switch args[0] { case "create": if err := goose.Run("create", nil, *dir, args[1:]...); err != nil { log.Fatalf("goose run: %v", err) } return case "fix": if err := goose.Run("fix", nil, *dir); err != nil { log.Fatalf("goose run: %v", err) } return } if len(args) < 3 { flags.Usage() return } if args[0] == "-h" || args[0] == "--help" { flags.Usage() return } driver, dbstring, command := args[0], args[1], args[2] switch dbstring { case "": log.Fatalf("-dbstring=%q not supported\n", dbstring) default: } db, err := goose.OpenDBWithDriver(driver, dbstring) if err != nil { log.Fatalf("goose run: %v\n", err) } arguments := []string{} if len(args) > 3 { arguments = append(arguments, args[3:]...) } if err := goose.Run(command, db, *dir, arguments...); err != nil { log.Fatalf("goose run: %v", err) } } func usage() { log.Print(usagePrefix) flags.PrintDefaults() log.Print(usageCommands) } var ( usagePrefix = `Usage: goose [OPTIONS] DRIVER DBSTRING COMMAND Drivers: postgres mysql sqlite3 redshift Examples: goose sqlite3 ./foo.db status goose sqlite3 ./foo.db create init sql goose sqlite3 ./foo.db create add_some_column sql goose sqlite3 ./foo.db create fetch_user_data go goose sqlite3 ./foo.db up goose postgres "user=postgres dbname=postgres sslmode=disable" status goose mysql "user:password@/dbname?parseTime=true" status goose redshift "postgres://user:password@qwerty.us-east-1.redshift.amazonaws.com:5439/db" status Options: ` usageCommands = ` Commands: up Migrate the DB to the most recent version available up-to VERSION Migrate the DB to a specific VERSION down Roll back the version by 1 down-to VERSION Roll back to a specific VERSION redo Re-run the latest migration status Dump the migration status for the current DB version Print the current version of the database create NAME [sql|go] Creates new migration file with the current timestamp fix Apply sequential ordering to migrations ` )