gokins/migrates/init.go
2021-07-30 19:23:15 +08:00

156 lines
3.2 KiB
Go

package migrates
import (
"database/sql"
"errors"
"fmt"
"github.com/gokins/gokins/comm"
"github.com/golang-migrate/migrate/v4"
"github.com/golang-migrate/migrate/v4/database/mysql"
"github.com/golang-migrate/migrate/v4/database/sqlite3"
_ "github.com/golang-migrate/migrate/v4/source/file"
bindata "github.com/golang-migrate/migrate/v4/source/go_bindata"
"path/filepath"
"strings"
)
func InitMysqlMigrate(host, dbs, user, pass string) (wait bool, rtul string, errs error) {
wait = false
if host == "" || dbs == "" || user == "" {
errs = errors.New("database config not found")
return
}
wait = true
ul := fmt.Sprintf("%s:%s@tcp(%s)/%s?parseTime=true&multiStatements=true",
user,
pass,
host,
dbs)
db, err := sql.Open("mysql", ul)
if err != nil {
errs = err
return
}
err = db.Ping()
if err != nil {
db.Close()
uls := fmt.Sprintf("%s:%s@tcp(%s)/?parseTime=true&multiStatements=true",
user,
pass,
host)
db, err = sql.Open("mysql", uls)
if err != nil {
println("open dbs err:" + err.Error())
errs = err
return
}
defer db.Close()
_, err = db.Exec(fmt.Sprintf("CREATE DATABASE `%s` DEFAULT CHARACTER SET utf8mb4;", dbs))
if err != nil {
println("create dbs err:" + err.Error())
errs = err
return
}
db.Exec(fmt.Sprintf("USE `%s`;", dbs))
err = db.Ping()
}
defer db.Close()
wait = false
if err != nil {
errs = err
return
}
// Run migrations
driver, err := mysql.WithInstance(db, &mysql.Config{})
if err != nil {
println("could not start sql migration... ", err.Error())
errs = err
return
}
defer driver.Close()
var nms []string
tms := comm.AssetNames()
for _, v := range tms {
if strings.HasPrefix(v, "mysql") {
nms = append(nms, strings.Replace(v, "mysql/", "", 1))
}
}
s := bindata.Resource(nms, func(name string) ([]byte, error) {
return comm.Asset("mysql/" + name)
})
sc, err := bindata.WithInstance(s)
if err != nil {
errs = err
return
}
defer sc.Close()
mgt, err := migrate.NewWithInstance(
"bindata", sc,
"mysql", driver)
if err != nil {
errs = err
return
}
defer mgt.Close()
err = mgt.Up()
if err != nil && err != migrate.ErrNoChange {
mgt.Down()
errs = err
return
}
return false, ul, nil
}
func InitSqliteMigrate() (rtul string, errs error) {
ul := filepath.Join(comm.WorkPath, "db.dat")
db, err := sql.Open("sqlite3", ul)
if err != nil {
errs = err
return
}
defer db.Close()
// Run migrations
driver, err := sqlite3.WithInstance(db, &sqlite3.Config{})
if err != nil {
println("could not start sql migration... ", err.Error())
errs = err
return
}
defer driver.Close()
var nms []string
tms := comm.AssetNames()
for _, v := range tms {
if strings.HasPrefix(v, "sqlite") {
nms = append(nms, strings.Replace(v, "sqlite/", "", 1))
}
}
s := bindata.Resource(nms, func(name string) ([]byte, error) {
return comm.Asset("sqlite/" + name)
})
sc, err := bindata.WithInstance(s)
if err != nil {
errs = err
return
}
defer sc.Close()
mgt, err := migrate.NewWithInstance(
"bindata", sc,
"sqlite3", driver)
if err != nil {
errs = err
return
}
defer mgt.Close()
err = mgt.Up()
if err != nil && err != migrate.ErrNoChange {
mgt.Down()
errs = err
return
}
return ul, nil
}