mirror of
				https://gitee.com/dromara/mayfly-go
				synced 2025-11-04 00:10:25 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			55 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			55 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
package migration
 | 
						|
 | 
						|
import (
 | 
						|
	"mayfly-go/migration/migrations"
 | 
						|
	"mayfly-go/pkg/logx"
 | 
						|
	"mayfly-go/pkg/rediscli"
 | 
						|
	"time"
 | 
						|
 | 
						|
	"github.com/go-gormigrate/gormigrate/v2"
 | 
						|
	"gorm.io/gorm"
 | 
						|
)
 | 
						|
 | 
						|
// RunMigrations 数据库迁移操作
 | 
						|
func RunMigrations(db *gorm.DB) error {
 | 
						|
	logx.Info("start to run migrations")
 | 
						|
	// 添加分布式锁, 防止多个服务同时执行迁移
 | 
						|
	lock := rediscli.NewLock("mayfly:db:migrations", 1*time.Minute)
 | 
						|
	if lock != nil {
 | 
						|
		if !lock.Lock() {
 | 
						|
			return nil
 | 
						|
		}
 | 
						|
		defer lock.UnLock()
 | 
						|
	}
 | 
						|
 | 
						|
	err := run(db,
 | 
						|
		migrations.Init,
 | 
						|
		migrations.V1_9,
 | 
						|
		migrations.V1_10,
 | 
						|
	)
 | 
						|
 | 
						|
	if err == nil {
 | 
						|
		logx.Info("migrations run success")
 | 
						|
	}
 | 
						|
	return err
 | 
						|
}
 | 
						|
 | 
						|
func run(db *gorm.DB, fs ...func() []*gormigrate.Migration) error {
 | 
						|
	var ms []*gormigrate.Migration
 | 
						|
	for _, f := range fs {
 | 
						|
		ms = append(ms, f()...)
 | 
						|
	}
 | 
						|
 | 
						|
	m := gormigrate.New(db, &gormigrate.Options{
 | 
						|
		TableName:                 "migrations",
 | 
						|
		IDColumnName:              "id",
 | 
						|
		IDColumnSize:              300,
 | 
						|
		UseTransaction:            true,
 | 
						|
		ValidateUnknownMigrations: false,
 | 
						|
	}, ms)
 | 
						|
	if err := m.Migrate(); err != nil {
 | 
						|
		return err
 | 
						|
	}
 | 
						|
	return nil
 | 
						|
}
 |