diff --git a/docs/content/doc/development/migrations.md b/docs/content/doc/development/migrations.md new file mode 100644 index 000000000..cca614fda --- /dev/null +++ b/docs/content/doc/development/migrations.md @@ -0,0 +1,67 @@ +--- +date: "2019-03-29:00:00+02:00" +title: "Database migrations" +draft: false +type: "doc" +menu: + sidebar: + parent: "development" +--- + +# Database Migrations + +Vikunja runs all database migrations automatically on each start if needed. +Additionally, they can also be run directly by using the `migrate` command. + +We use [xormigrate](https://github.com/techknowlogick/xormigrate) to handle migrations, which is based on gormigrate. + +## Add a new migration + +All migrations are stored in `pkg/migrations` and files should have the same name as their id. + +Each migration should have a function to apply and roll it back, as well as a numeric id (the datetime) +and a more in-depth description of what the migration actually does. + +To easily get a new id, run the following on any unix system: + +```bash +date +%Y%m%d%H%M%S +``` + +New migrations should be added via the `init()` function to the `migrations` variable. +All migrations are sorted before being executed, since `init()` does not guarantee the order. + +### Example + +```go +package migration + +import ( + "github.com/go-xorm/xorm" + "src.techknowlogick.com/xormigrate" +) + +// Used for rollback +type teamMembersMigration20190328074430 struct { + Updated int64 `xorm:"updated"` +} + +func (teamMembersMigration20190328074430) TableName() string { + return "team_members" +} + +func init() { + migrations = append(migrations, &xormigrate.Migration{ + ID: "20190328074430", + Description: "Remove updated from team_members", + Migrate: func(tx *xorm.Engine) error { + return dropTableColum(tx, "team_members", "updated") + }, + Rollback: func(tx *xorm.Engine) error { + return tx.Sync2(teamMembersMigration20190328074430{}) + }, + }) +} +``` + +You should always copy the changed parts of the struct you're changing when adding migraitons. \ No newline at end of file