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