niki/pkg/migrator/migrator.go

66 lines
1.4 KiB
Go

package migrator
import (
"database/sql"
"fmt"
"git.gocasts.ir/ebhomengo/niki/repository/mysql"
migrate "github.com/rubenv/sql-migrate"
)
type Migrator struct {
dialect string
dbConfig mysql.Config
migrations *migrate.FileMigrationSource
}
func New(dbConfig mysql.Config, path string) Migrator {
migrations := &migrate.FileMigrationSource{
Dir: path,
}
return Migrator{
dialect: "mysql",
dbConfig: dbConfig,
migrations: migrations,
}
}
func (m Migrator) Up() {
db, err := sql.Open(m.dialect, fmt.Sprintf("%s:%s@(%s:%d)/%s?parseTime=true",
m.dbConfig.Username,
m.dbConfig.Password,
m.dbConfig.Host,
m.dbConfig.Port,
m.dbConfig.DBName))
if err != nil {
fmt.Println(err)
panic(fmt.Errorf("can't open db : %v", err))
}
n, err := migrate.Exec(db, m.dialect, m.migrations, migrate.Up)
if err != nil {
panic(fmt.Errorf("can't apply migrations: %v", err))
}
fmt.Printf("Applied %d migrations!\n", n)
}
func (m Migrator) Down() {
db, err := sql.Open(m.dialect, fmt.Sprintf("%s:%s@(%s:%d)/%s?parseTime=true",
m.dbConfig.Username,
m.dbConfig.Password,
m.dbConfig.Host,
m.dbConfig.Port,
m.dbConfig.DBName))
if err != nil {
panic(fmt.Errorf("can't open db connection: %v", err))
}
n, err := migrate.Exec(db, m.dialect, m.migrations, migrate.Down)
if err != nil {
panic(fmt.Errorf("can't rollback migrations: %v", err))
}
fmt.Printf("Rollback %d migrations!\n", n)
}