# Databases

We use [PostgreSQL](https://www.postgresql.org).

## Local development database

1. Install PostgreSQL on your machine for local development.
   It should use the default Postgres port of 5432.

   If you use a Mac, the easiest way to do that is through installing
   https://postgresapp.com.

   Another option is to use `docker`. The following docker command will start a
   server locally, publish the server's default port to the corresponding local
   machine port, and set a password for the default database user (named
   `postgres`).

   ```
   docker run -d -p 5432:5432 -e POSTGRES_PASSWORD=pick_a_secret -e LANG=C postgres
   ```

   (NOTE: If you have already installed postgres on a workstation using `sudo apt-get install postgres`, you may have a server already running, and the above
   docker command will fail because it can't bind the port. At that point you can
   set `GO_DISCOVERY_DATABASE_TEST_`XXX environment variables to use your installed
   server, or stop the server using `pg_ctl stop` and use docker. The following
   assumes docker.)

   You must also install a postgres client (for example `psql`).

   At this point you should have a Postgres server running on your local machine
   at port 5432.

2. Set the following environment variables:

   - `GO_DISCOVERY_DATABASE_USER` (default: postgres)
   - `GO_DISCOVERY_DATABASE_PASSWORD` (default: '')
   - `GO_DISCOVERY_DATABASE_HOST` (default: localhost)
   - `GO_DISCOVERY_DATABASE_NAME` (default: discovery-db)

   See `internal/config/config.go` for details regarding construction of the
   database connection string.

3. Once you have Postgres installed, you should create the `discovery-db` database
   by running `devtools/create_local_db.sh`.

   Then apply migrations, as described in 'Migrations' below. You will need to do
   this each time a new migration is added, to keep your local schema up to date.

## Setting up for tests

Tests require a Postgres instance. If you followed step 1 in "Local development
database" above, then you have one.

Tests use the following environment variables:

- `GO_DISCOVERY_DATABASE_TEST_USER` (default: postgres)
- `GO_DISCOVERY_DATABASE_TEST_PASSWORD` (default: '')
- `GO_DISCOVERY_DATABASE_TEST_HOST` (default: localhost)
- `GO_DISCOVERY_DATABASE_TEST_PORT` (default: 5432)

If you followed the instructions in step 1 of "Local development database", then
you only need to set the password variable.

You don't need to create a database for testing; the tests will automatically
create a database for each package, with the name `discovery_{pkg}_test`. For
example, for internal/worker, tests run on the `discovery_worker_test` database.

If you ever run into issues with your test databases and need to reset them, you
can run `devtools/drop_test_dbs.sh`.

Run `./all.bash` to verify your setup.

## Migrations

Migrations are managed using
[github.com/golang-migrate/migrate](https://github.com/golang-migrate/migrate), with the
[CLI tool](https://github.com/golang-migrate/migrate/tree/master/cli).

### Creating a migration

To create a new migration:

```
devtools/create_migration.sh <title>
```

This creates two empty files in `/migrations`:

```
{version}_{title}.up.sql
{version}_{title}.down.sql
```

The two migration files are used to migrate "up" to the specified version from
the previous version, and to migrate "down" to the previous version. See
[golang-migrate/migrate/MIGRATIONS.md](https://github.com/golang-migrate/migrate/blob/master/MIGRATIONS.md)
for details.

### Applying migrations for local development

Use the `migrate` CLI:

```
devtools/migrate_db.sh [up|down|force|version] {#}
```

For additional details, see [golang-migrate/migrate/GETTING_STARTED.md#run-migrations](https://github.com/golang-migrate/migrate/blob/master/GETTING_STARTED.md#run-migrations).
