Files

66 lines
1.6 KiB
Bash

#!/bin/sh
set -eu
PSQL="psql --no-psqlrc --set=ON_ERROR_STOP=1"
echo "Проверка таблицы миграций"
$PSQL <<'SQL'
CREATE TABLE IF NOT EXISTS public.schema_migrations (
version text PRIMARY KEY,
checksum text NOT NULL,
applied_at timestamptz NOT NULL DEFAULT now()
);
REVOKE ALL ON public.schema_migrations FROM PUBLIC;
SQL
find /migrations \
-maxdepth 1 \
-type f \
-name '[0-9][0-9][0-9]_*.sql' |
sort |
while IFS= read -r file; do
version="$(basename "$file")"
checksum="$(sha256sum "$file" | cut -d ' ' -f 1)"
saved_checksum="$(
$PSQL \
--tuples-only \
--no-align \
--set=migration_version="$version" <<'SQL'
SELECT checksum
FROM public.schema_migrations
WHERE version = :'migration_version';
SQL
)"
if [ -n "$saved_checksum" ]; then
if [ "$saved_checksum" != "$checksum" ]; then
echo "Ошибка: применённая миграция $version была изменена"
exit 1
fi
echo "Пропуск $version"
continue
fi
echo "Применение $version"
{
echo "BEGIN;"
cat "$file"
echo ""
echo "INSERT INTO public.schema_migrations(version, checksum)"
echo "VALUES (:'migration_version', :'migration_checksum');"
echo "COMMIT;"
} |
$PSQL \
--set=migration_version="$version" \
--set=migration_checksum="$checksum"
echo "Миграция $version применена"
done
echo "Все миграции применены"