Files
play-life/play-life-backend/validate_baseline.sh
2026-02-08 17:01:36 +03:00

145 lines
4.9 KiB
Bash
Executable File
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/bin/bash
# Скрипт для проверки полноты baseline миграции
# Сравнивает текущую схему БД с baseline миграцией
set -e
# Цвета для вывода
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color
# Получаем переменные окружения
DB_HOST=${DB_HOST:-localhost}
DB_PORT=${DB_PORT:-5432}
DB_USER=${DB_USER:-playeng}
DB_PASSWORD=${DB_PASSWORD:-playeng}
DB_NAME=${DB_NAME:-playeng}
echo "=== Проверка полноты baseline миграции ==="
echo ""
# Проверяем наличие pg_dump
if ! command -v pg_dump &> /dev/null; then
echo -e "${RED}Ошибка: pg_dump не найден. Установите PostgreSQL client tools.${NC}"
exit 1
fi
# Создаем временную директорию
TMP_DIR=$(mktemp -d)
trap "rm -rf $TMP_DIR" EXIT
echo "1. Экспортируем текущую схему БД..."
PGPASSWORD=$DB_PASSWORD pg_dump \
-h $DB_HOST \
-p $DB_PORT \
-U $DB_USER \
-d $DB_NAME \
--schema-only \
--no-owner \
--no-privileges \
-f "$TMP_DIR/current_schema.sql"
if [ $? -ne 0 ]; then
echo -e "${RED}Ошибка: Не удалось экспортировать схему БД${NC}"
exit 1
fi
echo -e "${GREEN}✓ Схема экспортирована${NC}"
echo ""
# Применяем baseline миграцию к временной БД для сравнения
echo "2. Создаем временную БД для проверки baseline..."
TEMP_DB_NAME="playeng_baseline_test_$$"
PGPASSWORD=$DB_PASSWORD psql \
-h $DB_HOST \
-p $DB_PORT \
-U $DB_USER \
-d postgres \
-c "CREATE DATABASE $TEMP_DB_NAME;" > /dev/null 2>&1
if [ $? -ne 0 ]; then
echo -e "${YELLOW}Предупреждение: Не удалось создать временную БД. Продолжаем без неё.${NC}"
TEMP_DB_NAME=""
else
echo -e "${GREEN}✓ Временная БД создана${NC}"
fi
# Очистка временной БД при выходе
if [ -n "$TEMP_DB_NAME" ]; then
trap "PGPASSWORD=$DB_PASSWORD psql -h $DB_HOST -p $DB_PORT -U $DB_USER -d postgres -c 'DROP DATABASE IF EXISTS $TEMP_DB_NAME;' > /dev/null 2>&1; rm -rf $TMP_DIR" EXIT
fi
echo ""
echo "3. Анализ схемы..."
# Извлекаем только CREATE TABLE, CREATE INDEX, CREATE VIEW и т.д. из текущей схемы
grep -E "^(CREATE|ALTER|COMMENT)" "$TMP_DIR/current_schema.sql" | \
sed 's/--.*$//' | \
tr -d '\n' | \
sed 's/;/;\n/g' | \
sort > "$TMP_DIR/current_clean.sql"
# Извлекаем из baseline миграции
BASELINE_FILE="play-life-backend/migrations/000001_baseline.up.sql"
if [ ! -f "$BASELINE_FILE" ]; then
echo -e "${RED}Ошибка: Baseline файл не найден: $BASELINE_FILE${NC}"
exit 1
fi
grep -E "^(CREATE|ALTER|COMMENT)" "$BASELINE_FILE" | \
sed 's/--.*$//' | \
tr -d '\n' | \
sed 's/;/;\n/g' | \
sort > "$TMP_DIR/baseline_clean.sql"
echo ""
echo "4. Сравнение..."
# Сравниваем количество таблиц
CURRENT_TABLES=$(grep -c "CREATE TABLE" "$TMP_DIR/current_schema.sql" || echo "0")
BASELINE_TABLES=$(grep -c "CREATE TABLE" "$BASELINE_FILE" || echo "0")
echo " Текущая БД: $CURRENT_TABLES таблиц"
echo " Baseline: $BASELINE_TABLES таблиц"
if [ "$CURRENT_TABLES" -ne "$BASELINE_TABLES" ]; then
echo -e "${YELLOW}⚠ Количество таблиц не совпадает${NC}"
else
echo -e "${GREEN}✓ Количество таблиц совпадает${NC}"
fi
# Сравниваем количество индексов
CURRENT_INDEXES=$(grep -c "CREATE.*INDEX" "$TMP_DIR/current_schema.sql" || echo "0")
BASELINE_INDEXES=$(grep -c "CREATE.*INDEX" "$BASELINE_FILE" || echo "0")
echo " Текущая БД: $CURRENT_INDEXES индексов"
echo " Baseline: $BASELINE_INDEXES индексов"
if [ "$CURRENT_INDEXES" -ne "$BASELINE_INDEXES" ]; then
echo -e "${YELLOW}⚠ Количество индексов не совпадает${NC}"
else
echo -e "${GREEN}✓ Количество индексов совпадает${NC}"
fi
# Проверяем наличие materialized view
CURRENT_MV=$(grep -c "CREATE MATERIALIZED VIEW" "$TMP_DIR/current_schema.sql" || echo "0")
BASELINE_MV=$(grep -c "CREATE MATERIALIZED VIEW" "$BASELINE_FILE" || echo "0")
echo " Текущая БД: $CURRENT_MV materialized views"
echo " Baseline: $BASELINE_MV materialized views"
if [ "$CURRENT_MV" -ne "$BASELINE_MV" ]; then
echo -e "${YELLOW}⚠ Количество materialized views не совпадает${NC}"
else
echo -e "${GREEN}✓ Количество materialized views совпадает${NC}"
fi
echo ""
echo "=== Проверка завершена ==="
echo ""
echo "Для детального сравнения выполните:"
echo " diff $TMP_DIR/current_schema.sql $BASELINE_FILE"