# # Custom Migrations

> Gitaflow allows adding custom migration files that run whenever the `gitaflow database migrate:*` commands are executed. All migrations must reside in the `extensions/migrations` folder.

## # File Name

The file name follows the following structure:

    [identifier]-[name].js

for example:

    20201202A-my-custom-migration.js

## # Structure

Migrations have to export an `up` and a `down` function. These functions get a Knex
(opens new window) instance that can be used to do virtually whatever.

    module.exports = {
    	async up(knex) {
    		await knex.schema.createTable('test', (table) => {
    			table.increments();
    			table.string('rijk');
    		});
    	},

    	async down(knex) {
    		await knex.schema.dropTable('test');
    	},
    };

Danger

Seeing that these migrations are a bit of a free-for-all, you can really harm your database. Please make sure you know what you're doing and backup your database before adding these migrations.

## # Migrations and Gitaflow schema

Migrations can be used for managing contents of Gitaflow collections (e.g. initial hydration). In order to do it, you must ensure that schema is up to date before running migrations. One way of achieving it is opting out of default `gitaflow bootstrap` process and running:

    npx gitaflow database install
    # notice that schema is applied before running migrations
    npx gitaflow schema apply ./path/to/snapshot.yaml
    npx gitaflow database migrate:latest

You may want to add additional steps to reflect other responsibilities of `gitaflow bootstrap`.