2020-07-04 14:58:03 +00:00
|
|
|
package beegopro
|
|
|
|
|
|
|
|
import (
|
|
|
|
"database/sql"
|
|
|
|
"io/ioutil"
|
|
|
|
"path/filepath"
|
2020-07-11 09:44:39 +00:00
|
|
|
"strings"
|
2020-10-09 15:33:58 +00:00
|
|
|
|
2020-12-16 05:20:41 +00:00
|
|
|
beeLogger "github.com/beego/bee/v2/logger"
|
|
|
|
"github.com/beego/bee/v2/utils"
|
2020-07-04 14:58:03 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
var SQL utils.DocValue
|
2020-07-11 09:44:39 +00:00
|
|
|
var SQLMode utils.DocValue
|
|
|
|
var SQLModePath utils.DocValue
|
|
|
|
|
|
|
|
var (
|
|
|
|
SQLModeUp = "up"
|
|
|
|
SQLModeDown = "down"
|
|
|
|
)
|
2020-07-04 14:58:03 +00:00
|
|
|
|
|
|
|
func (c *Container) Migration(args []string) {
|
2020-07-05 06:54:26 +00:00
|
|
|
c.initUserOption()
|
|
|
|
db, err := sql.Open(c.UserOption.Driver, c.UserOption.Dsn)
|
2020-07-04 14:58:03 +00:00
|
|
|
if err != nil {
|
2020-07-05 06:54:26 +00:00
|
|
|
beeLogger.Log.Fatalf("Could not connect to '%s' database using '%s': %s", c.UserOption.Driver, c.UserOption.Dsn, err)
|
2020-07-04 14:58:03 +00:00
|
|
|
return
|
|
|
|
}
|
|
|
|
defer db.Close()
|
2020-07-11 09:44:39 +00:00
|
|
|
switch SQLMode.String() {
|
|
|
|
case SQLModeUp:
|
|
|
|
doByMode(db, "up.sql")
|
|
|
|
case SQLModeDown:
|
|
|
|
doByMode(db, "down.sql")
|
|
|
|
default:
|
|
|
|
doBySqlFile(db)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func doBySqlFile(db *sql.DB) {
|
|
|
|
fileName := SQL.String()
|
|
|
|
if !utils.IsExist(fileName) {
|
|
|
|
beeLogger.Log.Fatalf("sql mode path not exist, path %s", SQL.String())
|
|
|
|
}
|
|
|
|
doDb(db, fileName)
|
|
|
|
}
|
2020-07-04 14:58:03 +00:00
|
|
|
|
2020-07-11 09:44:39 +00:00
|
|
|
func doByMode(db *sql.DB, suffix string) {
|
|
|
|
pathName := SQLModePath.String()
|
|
|
|
if !utils.IsExist(pathName) {
|
|
|
|
beeLogger.Log.Fatalf("sql mode path not exist, path %s", SQLModePath.String())
|
|
|
|
}
|
|
|
|
|
|
|
|
rd, err := ioutil.ReadDir(pathName)
|
|
|
|
if err != nil {
|
|
|
|
beeLogger.Log.Fatalf("read dir err, path %s, err %s", pathName, err)
|
|
|
|
}
|
|
|
|
for _, fi := range rd {
|
|
|
|
if !fi.IsDir() {
|
|
|
|
if !strings.HasSuffix(fi.Name(), suffix) {
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
doDb(db, filepath.Join(pathName, fi.Name()))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func doDb(db *sql.DB, filePath string) {
|
|
|
|
absFile, _ := filepath.Abs(filePath)
|
|
|
|
content, err := ioutil.ReadFile(filePath)
|
2020-07-04 14:58:03 +00:00
|
|
|
if err != nil {
|
|
|
|
beeLogger.Log.Errorf("read file err %s, abs file %s", err, absFile)
|
|
|
|
}
|
|
|
|
|
2020-07-11 09:44:39 +00:00
|
|
|
_, err = db.Exec(string(content))
|
2020-07-04 14:58:03 +00:00
|
|
|
if err != nil {
|
|
|
|
beeLogger.Log.Errorf("db exec err %s", err)
|
|
|
|
}
|
2020-07-11 09:44:39 +00:00
|
|
|
beeLogger.Log.Infof("db exec info %s", filePath)
|
2020-07-04 14:58:03 +00:00
|
|
|
}
|