66 lines
1.6 KiB
Bash
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 "Все миграции применены"
|