feat: 自动迁移表结构

This commit is contained in:
Blizzard
2025-04-26 11:58:41 +08:00
parent 248ed10c62
commit 5e41df7dc2
7 changed files with 77 additions and 9 deletions
+1 -1
View File
@@ -13,7 +13,7 @@ mysql:
host: 127.0.0.1 host: 127.0.0.1
port: "3306" port: "3306"
prefix: "sundynix-" prefix: "sundynix-"
singular: false singular: true
user: root user: root
password: root password: root
+1 -1
View File
@@ -33,7 +33,7 @@ func (c *Zap) Levels() []zapcore.Level {
level = zapcore.DebugLevel level = zapcore.DebugLevel
} }
// 从解析的(或默认的)日志级别开始,迭代到 FatalLevel,并将每个级别追加到切片中 // 从解析的(或默认的)日志级别开始,迭代到 FatalLevel,并将每个级别追加到切片中 按照日志级别分片存储
for ; level <= zapcore.FatalLevel; level++ { for ; level <= zapcore.FatalLevel; level++ {
levels = append(levels, level) levels = append(levels, level)
} }
+26
View File
@@ -0,0 +1,26 @@
package global
import (
"gorm.io/gorm"
"time"
)
type BaseModel struct {
ID uint `gorm:"primarykey" json:"ID"` // 主键ID
CreatedAt time.Time // 创建时间
UpdatedAt time.Time // 更新时间
DeletedAt gorm.DeletedAt `gorm:"index" json:"-"` // 删除时间
}
// BeforeCreate 定义一个钩子,在创建之前执行自动插入字段
func (model BaseModel) BeforeCreate(db *gorm.DB) (err error) {
db.Statement.SetColumn("created_at", time.Now())
db.Statement.SetColumn("updated_at", time.Now())
return
}
// BeforeUpdate 定义一个钩子,在更新之前执行自动更新字段
func (model BaseModel) BeforeUpdate(db *gorm.DB) (err error) {
db.Statement.SetColumn("updated_at", time.Now())
return
}
+16
View File
@@ -1,8 +1,11 @@
package initialize package initialize
import ( import (
"go.uber.org/zap"
"gorm.io/gorm" "gorm.io/gorm"
"os"
"sundynix-go/global" "sundynix-go/global"
"sundynix-go/model/system"
) )
// Gorm 根据全局配置中的数据库类型返回对应的 *gorm.DB 实例。 // Gorm 根据全局配置中的数据库类型返回对应的 *gorm.DB 实例。
@@ -22,3 +25,16 @@ func Gorm() *gorm.DB {
return GormMysql() // 默认返回 MySQL 数据库的 *gorm.DB 实例 return GormMysql() // 默认返回 MySQL 数据库的 *gorm.DB 实例
} }
} }
// MigrateTable 创建数据库表结构。
func MigrateTable() {
db := global.DB
err := db.AutoMigrate(
system.User{},
)
if err != nil {
global.Logger.Error("Migrate table failed,err:", zap.Error(err))
os.Exit(0)
}
global.Logger.Info("Migrate table success")
}
+6 -7
View File
@@ -5,6 +5,7 @@ import (
"gorm.io/gorm" "gorm.io/gorm"
"sundynix-go/config" "sundynix-go/config"
"sundynix-go/global" "sundynix-go/global"
"sundynix-go/initialize/internal"
) )
// GormMysql 初始化Mysql数据库 // GormMysql 初始化Mysql数据库
@@ -28,15 +29,13 @@ func initMysqlDatabase(m config.Mysql) *gorm.DB {
DefaultStringSize: 191, // 默认字符串类型长度 DefaultStringSize: 191, // 默认字符串类型长度
SkipInitializeWithVersion: false, // 根据版本自动配置 SkipInitializeWithVersion: false, // 根据版本自动配置
} }
if db, err := gorm.Open(mysql.New(mysqlConfig), &gorm.Config{ if db, err := gorm.Open(mysql.New(mysqlConfig), internal.Gorm.Config(m.Prefix, m.Singular)); err != nil {
DisableForeignKeyConstraintWhenMigrating: true, // 禁用自动创建外键约束 panic(err)
}); err != nil {
return nil
} else { } else {
db.InstanceSet("gorm:table_options", "ENGINE="+m.Engine) db.InstanceSet("gorm:table_options", "ENGINE="+m.Engine)
sqlDB, _ := db.DB() sqlDb, _ := db.DB()
sqlDB.SetMaxIdleConns(m.MaxIdleConns) sqlDb.SetMaxIdleConns(m.MaxIdleConns)
sqlDB.SetMaxOpenConns(m.MaxOpenConns) sqlDb.SetMaxOpenConns(m.MaxOpenConns)
global.Logger.Info("Mysql connect success") global.Logger.Info("Mysql connect success")
return db return db
} }
+16
View File
@@ -1,6 +1,8 @@
package main package main
import ( import (
"context"
"database/sql"
"go.uber.org/zap" "go.uber.org/zap"
"sundynix-go/core" "sundynix-go/core"
"sundynix-go/global" "sundynix-go/global"
@@ -18,5 +20,19 @@ func main() {
global.DB = initialize.Gorm() global.DB = initialize.Gorm()
//redis连接 //redis连接
initialize.Redis() initialize.Redis()
global.Redis.Set(context.Background(), "test", 0, -1)
//迁移数据库
if global.DB != nil {
initialize.MigrateTable() // 迁移数据库结构
db, _ := global.DB.DB()
defer func(db *sql.DB) {
err := db.Close()
if err != nil {
global.Logger.Error("db close failed", zap.Error(err))
}
}(db)
}
} }
+11
View File
@@ -0,0 +1,11 @@
package system
import "sundynix-go/global"
type User struct {
global.BaseModel
ClientId string `gorm:"size:20;" json:"clientId"`
Account string `gorm:"size:11;unique;" json:"account" form:"account"`
Password string `gorm:"size:32;" json:"-" form:"password"`
Phone string `gorm:"size:11;" json:"phone" form:"phone"`
}