Stupidly simple SQL migrations
Stupidly simple SQL migrations
Migrations should be packages with your binary, so why not codify them!
//your-package/migrations/2020_09_21_115238_create_users_table.go
package migrations
import (
"database/sql"
"time"
"github.com/tcfw/go-migrate"
)
func init() {
register(migrate.NewSimpleMigration(
//Migration name to use in DB
"create_users_table",
//Timestamp of migration
time.Date(2020, 9, 21, 11, 52, 38, 0, time.Local),
//Up
func(tx *sql.Tx) error {
_, err := tx.Exec(`CREATE TABLE users (
id UUID PRIMARY KEY,
email string
)`)
return err
},
//Down
func(tx *sql.Tx) error {
_, err := tx.Exec(`DROP TABLE users`)
return err
},
))
}
//your-package/migrations/migrations.go
package migrations
import (
"database/sql"
"github.com/sirupsen/logrus"
"github.com/tcfw/go-migrate"
)
//migs List of known migrations
var migs migrate.MigrationList = migrate.MigrationList{}
//register helper to register migrations from init
func register(mig migrate.Migration) {
migs = append(migs, mig)
}
//Migrate runs migrations up (run in main or init)
func Migrate(db *sql.DB, log *logrus.Logger) error {
return migrate.Migrate(db, log, migs)
}