gf-common/autoMigrate/autoMigrate.go

90 lines
1.9 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

package autoMigrate
import (
"context"
_ "github.com/gogf/gf/contrib/drivers/mysql/v2"
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/os/gcfg"
"github.com/gogf/gf/v2/os/gctx"
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
var (
ctx context.Context
db *gorm.DB
)
type AutoMigrate struct {
ctx context.Context
db *gorm.DB
dns string
}
var am *AutoMigrate
func New() {
am = &AutoMigrate{}
am.ctx = gctx.New()
err := g.DB().PingMaster()
if err != nil {
g.Log().Error(ctx, "数据库连接失败", err)
return
}
dns, err := gcfg.Instance().Get(ctx, "dns", "")
if err != nil {
g.Log().Error(ctx, "获取配置失败", err)
return
}
if g.IsEmpty(dns) {
g.Log().Error(ctx, "gormDNS未配置", "请检查配置文件")
return
}
am.dns = dns.String()
am.db, err = gorm.Open(mysql.New(mysql.Config{
DSN: dns.String(),
DefaultStringSize: 255,
}), &gorm.Config{})
if err != nil {
g.Log().Error(ctx, "gorm连接数据库失败", err)
return
}
}
func SetAutoMigrate(models ...interface{}) {
New()
if g.IsNil(am.db) {
g.Log().Error(ctx, "数据库连接失败")
return
}
db = am.db.Set("gorm:table_options", "ENGINE=InnoDB")
err := db.AutoMigrate(models...)
if err != nil {
g.Log().Error(ctx, "数据库迁移失败", err)
}
}
func RenameColumn(dst interface{}, name, newName string) {
if am.db.Migrator().HasColumn(dst, name) {
err := am.db.Migrator().RenameColumn(dst, name, newName)
if err != nil {
g.Log().Error(am.ctx, "数据库修改字段失败", err)
}
} else {
g.Log().Info(am.ctx, "数据库字段不存在", name)
}
}
// DropColumn
// 删除字段
// 例DropColumn(&User{}, "Sex")
func DropColumn(dst interface{}, name string) {
if am.db.Migrator().HasColumn(dst, name) {
err := am.db.Migrator().DropColumn(dst, name)
if err != nil {
g.Log().Error(am.ctx, "数据库删除字段失败", err)
}
} else {
g.Log().Info(am.ctx, "数据库字段不存在", name)
}
}