# Database migration [Detailed information about this](http://ian-shafer.github.io/2016/02/02/db-migrations/) ## Setup #### Configuration The credentials for each environment that could be updated is stored in the `env/` directory. ***Example*** `env/default.conf` could look like this: ``` #!/bin/bash export PSQL_OPTS="-h HOST_NAME -U USER_NAME" export DB_NAME=DATABASE_NAME ``` Create one file for each environment you'd be able to migrate. When `db-upgrade` is issued, it takes the first part of any name as argument and performs the migration on selected environment. `$ ./db-upgrade localhost` would for example find a file named `localhost.conf` and use the credentials inside for the migration. To avoid having to enter password for selected user on each run, just use a [.pgpass](http://www.postgresql.org/docs/9.3/static/libpq-pgpass.html) file. `db-upgrade` assumes the `default` environment should be used if it's argument is omitted. So, start by creating an initial `default.conf` with credentials for your localhost or some non-critical environment. #### Migration files The files in the /migrations directory are changes to the scheme, not the full scheme. The naming convention for migration files are: - 000.000.sql - 000.001.sql - 000.002.sql - 000.003.sql - 000.004.sql - ...and so on **Example** The first file, `migrations/000.000.sql` may look like this: ``` create table users ( name varchar(32) not null, primary key (name) ); ``` The second file, `migrations/000.001.sql` may look like this: ``` alter table users add email varchar(256) not null; ``` To do the actual migration, then just run: ``` # ./db-upgrade [ENVIRONMENT NAME] ``` **Example docker-compose.yml for postgres** Execute this first: ```bash mkdir data chmod o+rwx data ``` ```yml version: '3.7' services: db: image: postgres:13 restart: always environment: POSTGRES_PASSWORD: postgres TZ: 'Europe/Stockholm' PGTZ: 'Europe/Stockholm' ports: - "5432:5432" volumes: - ./data:/var/lib/postgresql/data - /var/run/postgresql:/var/run/postgresql networks: default: external: true name: postgres ```