Create db migrations framework
This commit is contained in:
		
							parent
							
								
									161774d4fb
								
							
						
					
					
						commit
						bb103e8723
					
				
					 2 changed files with 53 additions and 0 deletions
				
			
		
							
								
								
									
										47
									
								
								models/migrations/migrations.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										47
									
								
								models/migrations/migrations.go
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,47 @@ | |||
| package migrations | ||||
| 
 | ||||
| import ( | ||||
| 	"errors" | ||||
| 	"github.com/go-xorm/xorm" | ||||
| ) | ||||
| 
 | ||||
| type migration func(*xorm.Engine) error | ||||
| 
 | ||||
| // The version table. Should have only one row with id==1
 | ||||
| type Version struct { | ||||
| 	Id      int64 `xorm:"pk"` | ||||
| 	Version int64 | ||||
| } | ||||
| 
 | ||||
| // This is a sequence of migrations. Add new migrations to the bottom of the list.
 | ||||
| // If you want to "retire" a migration, replace it with "expiredMigration"
 | ||||
| var migrations = []migration{} | ||||
| 
 | ||||
| // Migrate database to current version
 | ||||
| func Migrate(x *xorm.Engine) error { | ||||
| 	x.Sync(new(Version)) | ||||
| 
 | ||||
| 	currentVersion := &Version{Id: 1} | ||||
| 	has, err := x.Get(currentVersion) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	if !has { | ||||
| 		_, err = x.InsertOne(currentVersion) | ||||
| 	} | ||||
| 
 | ||||
| 	v := currentVersion.Version | ||||
| 
 | ||||
| 	for i, migration := range migrations[v:] { | ||||
| 		if err = migration(x); err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 		currentVersion.Version = v + int64(i) + 1 | ||||
| 		x.Id(1).Update(currentVersion) | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
| 
 | ||||
| func expiredMigration(x *xorm.Engine) error { | ||||
| 	return errors.New("You are migrating from a too old gogs version") | ||||
| } | ||||
|  | @ -15,6 +15,7 @@ import ( | |||
| 	"github.com/go-xorm/xorm" | ||||
| 	_ "github.com/lib/pq" | ||||
| 
 | ||||
| 	"github.com/gogits/gogs/models/migrations" | ||||
| 	"github.com/gogits/gogs/modules/setting" | ||||
| ) | ||||
| 
 | ||||
|  | @ -131,6 +132,11 @@ func NewEngine() (err error) { | |||
| 	if err = SetEngine(); err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 
 | ||||
| 	if err = migrations.Migrate(x); err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 
 | ||||
| 	if err = x.StoreEngine("InnoDB").Sync2(tables...); err != nil { | ||||
| 		return fmt.Errorf("sync database struct error: %v\n", err) | ||||
| 	} | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue