145 lines
4.9 KiB
Bash
Executable File
145 lines
4.9 KiB
Bash
Executable File
#!/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"
|