Skip to content

Instantly share code, notes, and snippets.

@abrkn

abrkn/db-migrate.sh

Created Aug 7, 2020
Embed
What would you like to do?
#!/usr/bin/env bash
#
# Run database migrations with the power of bash
#
set -eu -o pipefail
cd "$(dirname "$0")/.."
if [ "$#" -lt 2 ]; then
1>&2 echo "Usage: $0 postgres://url/db <migration dir>"
exit 1
fi
db_url="$1"
dir="$2"
migration_table="pg_migrate_test"
if [ ! -d "$dir" ]; then
1>&2 echo "ERROR: Directory $dir not found"
exit 1
fi
if ! psql -v ON_ERROR_STOP=1 -c "create table if not exists $migration_table (migration_id text primary key)" "$db_url"; then
1>&2 echo "ERROR: Could not find/create table $migration_table"
exit 1
fi
# Space separated
existing_migrations=$(psql -v ON_ERROR_STOP=1 -t -X -A -c "select migration_id from $migration_table order by migration_id asc" "$db_url")
migrated_any=
find $dir -iname '*.sql' | sort | while read migration_path; do
migration_fn=`basename "$migration_path"`
migration_id=`echo $migration_fn | grep -Eo '^[0-9]*'`
if [[ "$existing_migrations" =~ [[:\<:]]$migration_id[[:\>:]] ]]; then
# Migration has already been run
continue
fi
# Run migration
if ! psql -v ON_ERROR_STOP=1 -f "$migration_path" "$db_url" > /dev/null; then
1>&2 echo "FAIL: $migration_fn"
exit 1
fi
echo "$migration_fn: OK"
psql -v ON_ERROR_STOP=1 -c "insert into $migration_table (migration_id) values ('$migration_id')" "$db_url" > /dev/null
migrated_any=1
done
if [ -z "$migrated_any" ]; then
echo "No new migrations to run"
fi
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.