From c4969084ff35cb2c8028552edf54b2281f8f0084 Mon Sep 17 00:00:00 2001 From: Matthew Dillon Date: Tue, 14 Jul 2015 10:12:01 -0800 Subject: [PATCH] Hold onto user accounts during migration drop --- main.go | 23 +++++++++++++++++++++++ migrations/00001_AddUsers_down.sql | 3 --- migrations/00001_AddUsers_up.sql | 15 +++++---------- 3 files changed, 28 insertions(+), 13 deletions(-) diff --git a/main.go b/main.go index c3d8674..8926c1b 100644 --- a/main.go +++ b/main.go @@ -126,13 +126,36 @@ func cmdMigrateDb(c *cli.Context) { log.Fatal("Error initializing migrations: ", err) } + users := make(Users, 0) + if c.Bool("drop") { + // Back up users table + if err := DBH.Select(&users, `SELECT * FROM users;`); err != nil { + log.Fatal("Couldn't back up identity tables: ", err) + } + log.Printf("%+v Users", len(users)) + + // Drop tables if err = migrator.RollbackAll(); err != nil && err != gomigrate.NoActiveMigrations { log.Fatal("Error rolling back migrations: ", err) } } + // Run migrations if err = migrator.Migrate(); err != nil { log.Fatal("Error applying migrations: ", err) } + + // If we dropped, restore the user records + if c.Bool("drop") { + // Stick users back into DB + if len(users) > 0 { + // varargs don't seem to work here, loop instead + for _, user := range users { + if err := DBH.Insert(user); err != nil { + log.Fatal("Couldn't restore user: ", err) + } + } + } + } } diff --git a/migrations/00001_AddUsers_down.sql b/migrations/00001_AddUsers_down.sql index 5687732..2086380 100644 --- a/migrations/00001_AddUsers_down.sql +++ b/migrations/00001_AddUsers_down.sql @@ -1,9 +1,6 @@ -- bactdb -- Matthew R Dillon --- Need to include something to keep gomigrate happy. --- SELECT 1; - DROP TABLE users; DROP TYPE e_roles; diff --git a/migrations/00001_AddUsers_up.sql b/migrations/00001_AddUsers_up.sql index 66f9fff..b706f90 100644 --- a/migrations/00001_AddUsers_up.sql +++ b/migrations/00001_AddUsers_up.sql @@ -1,17 +1,12 @@ -- bactdb -- Matthew R Dillon -DO $$ -BEGIN - IF NOT EXISTS (SELECT 1 FROM pg_type WHERE typname = 'e_roles') THEN - CREATE TYPE e_roles AS ENUM('R', 'W', 'A'); - -- 'R': read-only, default - -- 'W': read-write - -- 'A': administrator - END IF; -END$$; +CREATE TYPE e_roles AS ENUM('R', 'W', 'A'); +-- 'R': read-only, default +-- 'W': read-write +-- 'A': administrator -CREATE TABLE IF NOT EXISTS users ( +CREATE TABLE users ( id BIGSERIAL NOT NULL, email CHARACTER VARYING(254) NOT NULL UNIQUE, password CHARACTER(60) NOT NULL,