Files
play-life/play-life-backend/validate_baseline.sh

145 lines
4.9 KiB
Bash
Raw Permalink Normal View History

#!/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"