add schema deploy module

This commit is contained in:
Jay
2018-09-19 22:06:27 +08:00
parent a43bf98e21
commit ee12feda5d
5 changed files with 141 additions and 8 deletions
+77
View File
@@ -1,6 +1,83 @@
package cmd
import (
"database/sql"
"errors"
"fmt"
"log"
"git.trj.tw/golang/mtfosbot/module/schema"
"git.trj.tw/golang/mtfosbot/model"
)
// DBTool - deploy database schemas
func DBTool() {
db := model.GetDB()
if db == nil {
log.Fatal(errors.New("database object is nil"))
}
dbver, err := schema.ReadVersions()
if err != nil {
log.Fatal(err)
}
version := -1
vcExists := false
// check version_ctrl table exists
row := db.QueryRowx(`select exists(select 1 from "information_schema"."tables" where "table_schema" = $1 and "table_name" = $2) as exists`, "public", "version_ctrl")
err = row.Scan(&vcExists)
if err != nil && err != sql.ErrNoRows {
log.Fatal(err)
}
// read max version
if vcExists {
row := db.QueryRowx(`select max(version) as version from "public"."version_ctrl"`)
err := row.Scan(&version)
if err != nil && err != sql.ErrNoRows {
log.Fatal(err)
}
}
fmt.Println("Database Schema Version is ", version)
var vers []schema.VersionInfo
for _, v := range dbver.Versions {
if v.Version > version {
vers = append(vers, v)
}
}
if len(vers) == 0 {
return
}
tx, err := db.Beginx()
if err != nil {
log.Fatal(err)
}
for _, v := range vers {
fmt.Printf("Run Version: %d, FileName: %s\n", v.Version, v.File)
query, err := schema.ReadSchema(v.File)
if err != nil {
tx.Rollback()
log.Fatal(err)
}
// run schema file
_, err = tx.Exec(query)
if err != nil {
tx.Rollback()
log.Fatal(err)
}
// insert version ctrl
_, err = tx.Exec(`insert into "public"."version_ctrl" ("version", "ctime", "querystr") values ($1, now(), $2)`, v.Version, query)
if err != nil {
tx.Rollback()
log.Fatal(err)
}
}
tx.Commit()
}
+43
View File
@@ -0,0 +1,43 @@
package schema
import (
"encoding/json"
"errors"
"fmt"
)
// DBVersions -
type DBVersions struct {
Versions []VersionInfo `json:"versions"`
Test []VersionInfo `json:"test"`
}
// VersionInfo -
type VersionInfo struct {
File string `json:"file"`
Version int `json:"version"`
}
// ReadVersions -
func ReadVersions() (dbver DBVersions, err error) {
f, err := Asset("schema/dbVersion.json")
if err != nil {
return dbver, err
}
err = json.Unmarshal(f, &dbver)
return
}
// ReadSchema -
func ReadSchema(name string) (q string, err error) {
if len(name) == 0 {
return "", errors.New("name is empty")
}
f, err := Asset(fmt.Sprintf("schema/%s", name))
if err != nil {
return
}
q = string(f)
return
}