#!/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 "Все миграции применены"