提交 9fa92d07 编写于 作者: S SampsonYe

support basic db migration by code

上级 53143481
package migrations
import (
"fmt"
"github.com/astaxie/beego/orm"
"github.com/go-atomci/atomci/internal/middleware/log"
"os"
"time"
)
type Migration20220101 struct {
}
func (m Migration20220101) GetCreateAt() time.Time {
return time.Date(2022, 1, 1, 0, 0, 0, 0, time.Local)
}
func (m Migration20220101) Upgrade(ormer orm.Ormer) {
tables := []string{
"sys_resource_type",
"sys_resource_operation",
"sys_resource_constraint",
"sys_user",
"sys_group",
"sys_group_user_rel",
"sys_group_user_constraint",
"sys_group_role",
"sys_group_role_user",
"sys_group_role_operation",
"sys_audit",
"sys_resource_router",
}
if err := setCreateAt(ormer, tables); err != nil {
log.Log.Error(err.Error())
os.Exit(2)
}
if err := setUpdateAt(ormer, tables); err != nil {
log.Log.Error(err.Error())
os.Exit(2)
}
}
func setCreateAt(ormer orm.Ormer, tables []string) error {
for _, table := range tables {
var count int
sql := `SELECT count(1) FROM INFORMATION_SCHEMA.Columns WHERE table_schema=DATABASE() AND table_name=?
AND column_name='create_at' AND COLUMN_DEFAULT='CURRENT_TIMESTAMP'`
if err := ormer.Raw(sql, table).QueryRow(&count); err != nil {
return err
}
if count == 0 {
sql = `alter table ` + table + ` modify column create_at datetime not null DEFAULT CURRENT_TIMESTAMP`
if _, err := ormer.Raw(sql).Exec(); err != nil {
return err
}
log.Log.Info(sql)
} else {
log.Log.Debug(fmt.Sprintf("table `%v` already alter create_at, skip", table))
}
}
return nil
}
func setUpdateAt(ormer orm.Ormer, tables []string) error {
for _, table := range tables {
var count int
sql := `SELECT count(1) FROM INFORMATION_SCHEMA.Columns WHERE table_schema=DATABASE() AND table_name=?
AND column_name='update_at' AND COLUMN_DEFAULT='CURRENT_TIMESTAMP' AND EXTRA='on update CURRENT_TIMESTAMP'`
if err := ormer.Raw(sql, table).QueryRow(&count); err != nil {
return err
}
if count == 0 {
sql = `alter table ` + table + ` modify column update_at datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP`
if _, err := ormer.Raw(sql).Exec(); err != nil {
return err
}
log.Log.Info(sql)
} else {
log.Log.Debug(fmt.Sprintf("table `%v` already alter update_at, skip", table))
}
}
return nil
}
package migrations
import (
"github.com/astaxie/beego/orm"
"strings"
"time"
)
type Migration20220309 struct {
}
func (m Migration20220309) GetCreateAt() time.Time {
return time.Date(2022, 3, 9, 0, 0, 0, 0, time.Local)
}
func (m Migration20220309) Upgrade(ormer orm.Ormer) {
ormer.Raw("UPDATE `sys_integrate_setting` SET `type`='registry' WHERE `type`='harbor';").Exec()
ormer.Raw(strings.ReplaceAll(`DROP PROCEDURE IF EXISTS <|SPIT|>ModifyHarborToRegistry<|SPIT|>;
delimiter $$
CREATE PROCEDURE <|SPIT|>ModifyHarborToRegistry<|SPIT|>()
BEGIN
DECLARE HARBOREXISTS int DEFAULT 0;
DECLARE REGISTRYEXISTS int DEFAULT 0;
SELECT count(1) INTO @HARBOREXISTS FROM information_schema.COLUMNS WHERE TABLE_NAME='project_env' AND COLUMN_NAME='harbor';
SELECT count(1) INTO @REGISTRYEXISTS FROM information_schema.COLUMNS WHERE TABLE_NAME='project_env' AND COLUMN_NAME='registry';
IF @HARBOREXISTS>0 AND @REGISTRYEXISTS=0 #存在harbor列 不存在registry列时 直接修改列名
THEN
ALTER TABLE <|SPIT|>project_env<|SPIT|> CHANGE COLUMN <|SPIT|>harbor<|SPIT|> <|SPIT|>registry<|SPIT|> bigint(20) NOT NULL DEFAULT 0;
ELSEIF @HARBOREXISTS>0 AND @REGISTRYEXISTS>0 #harbor列和registry都存在时迁移数据并删除harbor列
THEN
UPDATE <|SPIT|>project_env<|SPIT|> SET <|SPIT|>registry<|SPIT|>=<|SPIT|>harbor<|SPIT|>;
ALTER TABLE <|SPIT|>project_env<|SPIT|> DROP COLUMN <|SPIT|>harbor<|SPIT|>;
END IF;
END;
$$
delimiter ;
CALL <|SPIT|>ModifyHarborToRegistry<|SPIT|>;
DROP PROCEDURE IF EXISTS <|SPIT|>ModifyHarborToRegistry<|SPIT|>;`, "<|SPIT|>", "`")).Exec()
}
......@@ -18,11 +18,9 @@ package models
import (
"fmt"
"os"
"github.com/go-atomci/atomci/internal/migrations"
"time"
"github.com/go-atomci/atomci/internal/middleware/log"
"github.com/astaxie/beego"
"github.com/astaxie/beego/orm"
"github.com/go-sql-driver/mysql"
......@@ -37,6 +35,12 @@ type Addons struct {
DeleteAt *time.Time `orm:"column(delete_at);type(datetime);index;null" json:"delete_at"`
}
// db migration base interface
type Migration interface {
GetCreateAt() time.Time
Upgrade(ormer orm.Ormer)
}
// TableNamePrefix ..
const TableNamePrefix = "atom"
......@@ -62,54 +66,11 @@ func (a *Addons) MarkDeleted() {
}
var (
dbName string
tableNames []string
dbName string
tableNames []string
migrationTypes []Migration
)
func setCreateAt(tables []string) error {
for _, table := range tables {
var count int
sql := `SELECT count(1) FROM INFORMATION_SCHEMA.Columns WHERE table_schema=DATABASE() AND table_name=?
AND column_name='create_at' AND COLUMN_DEFAULT='CURRENT_TIMESTAMP'`
ormer := orm.NewOrm()
if err := ormer.Raw(sql, table).QueryRow(&count); err != nil {
return err
}
if count == 0 {
sql = `alter table ` + table + ` modify column create_at datetime not null DEFAULT CURRENT_TIMESTAMP`
if _, err := ormer.Raw(sql).Exec(); err != nil {
return err
}
log.Log.Info(sql)
} else {
log.Log.Debug(fmt.Sprintf("table `%v` already alter create_at, skip", table))
}
}
return nil
}
func setUpdateAt(tables []string) error {
for _, table := range tables {
var count int
sql := `SELECT count(1) FROM INFORMATION_SCHEMA.Columns WHERE table_schema=DATABASE() AND table_name=?
AND column_name='update_at' AND COLUMN_DEFAULT='CURRENT_TIMESTAMP' AND EXTRA='on update CURRENT_TIMESTAMP'`
ormer := orm.NewOrm()
if err := ormer.Raw(sql, table).QueryRow(&count); err != nil {
return err
}
if count == 0 {
sql = `alter table ` + table + ` modify column update_at datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP`
if _, err := ormer.Raw(sql).Exec(); err != nil {
return err
}
log.Log.Info(sql)
} else {
log.Log.Debug(fmt.Sprintf("table `%v` already alter update_at, skip", table))
}
}
return nil
}
func initOrm() {
DatabaseURL := beego.AppConfig.String("DB::url")
DatabaseDebug, _ := beego.AppConfig.Bool("DB::debug")
......@@ -193,27 +154,18 @@ func initOrm() {
orm.RunSyncdb("default", false, true)
tables := []string{
"sys_resource_type",
"sys_resource_operation",
"sys_resource_constraint",
"sys_user",
"sys_group",
"sys_group_user_rel",
"sys_group_user_constraint",
"sys_group_role",
"sys_group_role_user",
"sys_group_role_operation",
"sys_audit",
"sys_resource_router",
}
if err := setCreateAt(tables); err != nil {
log.Log.Error(err.Error())
os.Exit(2)
}
//db migration register
func initMigration() {
migrationTypes = []Migration{
new(migrations.Migration20220101),
new(migrations.Migration20220309),
}
if err := setUpdateAt(tables); err != nil {
log.Log.Error(err.Error())
os.Exit(2)
//数据迁移
for _, m := range migrationTypes {
m.Upgrade(orm.NewOrm())
}
}
......@@ -223,5 +175,6 @@ func init() {
return
}
initOrm()
initMigration()
// orm.RunSyncdb("default", false, true)
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册