package main import ( "database/sql" "flag" "fmt" "log" "os" "github.com/pressly/goose" _ "github.com/pressly/goose/example/migrations-go" _ "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) != 3 { flags.Usage() return } if args[0] == "-h" || args[0] == "--help" { flags.Usage() return } driver, dbstring, command := args[0], args[1], args[2] switch driver { case "postgres", "mysql", "sqlite3": if err := goose.SetDialect(driver); err != nil { log.Fatal(err) } default: log.Fatalf("%q driver not supported\n", driver) } switch dbstring { case "": log.Fatalf("-dbstring=%q not supported\n", dbstring) default: } db, err := sql.Open(driver, dbstring) if err != nil { log.Fatalf("-dbstring=%q: %v\n", dbstring, err) } if err := goose.Run(command, db, *dir); err != nil { log.Fatalf("goose run: %v", err) } } func usage() { fmt.Print(usagePrefix) flags.PrintDefaults() fmt.Print(usageCommands) } var ( usagePrefix = `Usage: goose [OPTIONS] DRIVER DBSTRING COMMAND Examples: goose postgres "user=postgres dbname=postgres sslmode=disable" up goose mysql "user:password@/dbname" down goose sqlite3 ./foo.db status Options: ` usageCommands = ` Commands: up Migrate the DB to the most recent version available down Roll back the version by 1 redo Re-run the latest migration status Dump the migration status for the current DB dbversion Print the current version of the database ` )