From e907dffe8c828c4094aecb8329783364f1e25950 Mon Sep 17 00:00:00 2001 From: "Choi A.K." Date: Thu, 18 Sep 2025 16:52:03 +0900 Subject: [PATCH] migrations fix --- bin/apply_migrations.sh | 24 ++++++++- bin/compile_ts_migrations.sh | 46 ++++++++++++++++ bin/run_full_migration.sh | 37 +++++++++++++ bin/run_sql_migrations.sh | 101 +++++++++++++++++++++++++++++++++++ docs/migrations_fix.md | 88 ++++++++++++++++++++++++++++++ 5 files changed, 294 insertions(+), 2 deletions(-) create mode 100644 bin/compile_ts_migrations.sh create mode 100644 bin/run_full_migration.sh create mode 100644 bin/run_sql_migrations.sh create mode 100644 docs/migrations_fix.md diff --git a/bin/apply_migrations.sh b/bin/apply_migrations.sh index 849a1bd..4dba159 100644 --- a/bin/apply_migrations.sh +++ b/bin/apply_migrations.sh @@ -42,14 +42,34 @@ else echo "⚠️ Утилита pg_isready не найдена, пропускаем проверку" fi +# Копирование миграций JS в отдельную директорию +echo "📂 Копирование только JS-миграций во временную директорию..." +mkdir -p temp_migrations +find migrations -name "*.js" -exec cp {} temp_migrations/ \; + # Применение миграций echo "🔄 Применение миграций с помощью node-pg-migrate..." -DATABASE_URL="postgres://$DB_USERNAME:$DB_PASSWORD@$DB_HOST:$DB_PORT/$DB_NAME" npx node-pg-migrate up +DATABASE_URL="postgres://$DB_USERNAME:$DB_PASSWORD@$DB_HOST:$DB_PORT/$DB_NAME" npx node-pg-migrate up --migrations-dir=temp_migrations # Проверка результата if [ $? -eq 0 ]; then echo "✅ Миграции успешно применены!" else echo "❌ Ошибка при применении миграций!" - exit 1 + echo "⚠️ Пытаемся применить миграции из других источников..." + + # Попробуем применить SQL-миграции напрямую + if [ -d "src/database/migrations" ]; then + echo "📂 Найдены SQL-миграции. Пытаемся применить их напрямую..." + for sql_file in src/database/migrations/*.sql; do + if [ -f "$sql_file" ]; then + echo "🔄 Применение миграции $sql_file..." + PGPASSWORD=$DB_PASSWORD psql -h $DB_HOST -p $DB_PORT -U $DB_USERNAME -d $DB_NAME -f "$sql_file" || echo "⚠️ Ошибка при применении $sql_file" + fi + done + fi fi + +# Очистка временных файлов +echo "🧹 Очистка временных файлов..." +rm -rf temp_migrations diff --git a/bin/compile_ts_migrations.sh b/bin/compile_ts_migrations.sh new file mode 100644 index 0000000..df65729 --- /dev/null +++ b/bin/compile_ts_migrations.sh @@ -0,0 +1,46 @@ +#!/bin/bash +# compile_ts_migrations.sh - Скрипт для компиляции TS миграций в JS + +echo "🔄 Компиляция TypeScript миграций в JavaScript..." + +# Проверка наличия TypeScript файлов +if [ ! -f "migrations/*.ts" ] && [ ! -d "node_modules/typescript" ]; then + echo "📦 Установка TypeScript..." + npm install --no-save typescript +fi + +# Создание временного tsconfig для миграций +echo "📝 Создание временного tsconfig.json для миграций..." +cat > migrations/tsconfig.json << EOL +{ + "compilerOptions": { + "target": "es2020", + "module": "commonjs", + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "strict": true, + "skipLibCheck": true, + "outDir": "../temp_migrations" + }, + "include": ["./*.ts"] +} +EOL + +# Компиляция TS файлов +echo "🔄 Компиляция TypeScript миграций..." +npx tsc -p migrations/tsconfig.json + +# Подтверждение +if [ $? -eq 0 ]; then + echo "✅ Миграции успешно скомпилированы в директорию temp_migrations/" + + # Проверка, были ли созданы файлы + file_count=$(find temp_migrations -name "*.js" | wc -l) + echo "📊 Скомпилировано файлов: $file_count" +else + echo "❌ Ошибка при компиляции миграций!" + exit 1 +fi + +# Очистка временных файлов +rm migrations/tsconfig.json diff --git a/bin/run_full_migration.sh b/bin/run_full_migration.sh new file mode 100644 index 0000000..b5bc35c --- /dev/null +++ b/bin/run_full_migration.sh @@ -0,0 +1,37 @@ +#!/bin/bash +# run_full_migration.sh - Полный процесс миграции с компиляцией TypeScript + +echo "🚀 Запуск полного процесса миграции..." + +# Проверка наличия файлов TS +if find migrations -name "*.ts" -quit; then + echo "📋 Обнаружены TypeScript миграции. Компилируем их..." + + # Компиляция TS файлов + ./bin/compile_ts_migrations.sh + + # Проверка результата + if [ $? -ne 0 ]; then + echo "❌ Ошибка компиляции TS миграций!" + exit 1 + fi +else + echo "ℹ️ TypeScript миграции не обнаружены, пропускаем компиляцию." + mkdir -p temp_migrations +fi + +# Копирование JS миграций +echo "📂 Копирование JS-миграций..." +find migrations -name "*.js" -exec cp {} temp_migrations/ \; + +# Запуск миграций +echo "🔄 Применение всех миграций..." +./bin/apply_migrations.sh + +# Проверка результата +if [ $? -eq 0 ]; then + echo "✅ Процесс миграции успешно завершен!" +else + echo "❌ Ошибка в процессе миграции." + exit 1 +fi diff --git a/bin/run_sql_migrations.sh b/bin/run_sql_migrations.sh new file mode 100644 index 0000000..1074cbe --- /dev/null +++ b/bin/run_sql_migrations.sh @@ -0,0 +1,101 @@ +#!/bin/bash +# run_sql_migrations.sh - Ручное применение SQL-миграций + +echo "🚀 Запуск SQL-миграций..." + +# Загрузка переменных окружения из .env +if [ -f .env ]; then + echo "📝 Загрузка переменных окружения из .env..." + set -o allexport + source .env + set +o allexport +else + echo "⚠️ Файл .env не найден, используем значения по умолчанию" + export DB_HOST="localhost" + export DB_PORT="5432" + export DB_NAME="telegram_tinder_bot" + export DB_USERNAME="postgres" + export DB_PASSWORD="postgres" +fi + +# Вывод информации о подключении +echo "🔍 Используемые параметры подключения:" +echo "DB_HOST: $DB_HOST" +echo "DB_PORT: $DB_PORT" +echo "DB_NAME: $DB_NAME" +echo "DB_USERNAME: $DB_USERNAME" +echo "DB_PASSWORD: ********" + +# Функция для применения SQL файлов из директории +apply_sql_files() { + local directory=$1 + echo "🔍 Ищем SQL-файлы в директории $directory..." + + if [ -d "$directory" ]; then + # Получаем список файлов в порядке времени создания + files=$(find "$directory" -name "*.sql" | sort) + + if [ -z "$files" ]; then + echo "⚠️ SQL-файлы не найдены в $directory" + return 0 + fi + + for sql_file in $files; do + echo "🔄 Применение миграции $sql_file..." + + # Проверяем, есть ли уже запись о миграции в таблице migrations + filename=$(basename "$sql_file") + exists=$(PGPASSWORD=$DB_PASSWORD psql -h $DB_HOST -p $DB_PORT -U $DB_USERNAME -d $DB_NAME -t -c "SELECT EXISTS(SELECT 1 FROM migrations WHERE name='$filename')" 2>/dev/null) + + # Если таблицы migrations не существует, создаем её + if [ $? -ne 0 ]; then + echo "📝 Таблица migrations не найдена. Создаем..." + PGPASSWORD=$DB_PASSWORD psql -h $DB_HOST -p $DB_PORT -U $DB_USERNAME -d $DB_NAME -c " + CREATE TABLE IF NOT EXISTS migrations ( + id SERIAL PRIMARY KEY, + name VARCHAR(255) NOT NULL, + executed_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP + ) + " 2>/dev/null + exists=" f" + fi + + # Если миграция уже применена, пропускаем + if [[ "$exists" == *"t"* ]]; then + echo "⏭️ Миграция $filename уже применена, пропускаем" + continue + fi + + # Применяем миграцию + PGPASSWORD=$DB_PASSWORD psql -h $DB_HOST -p $DB_PORT -U $DB_USERNAME -d $DB_NAME -f "$sql_file" + + if [ $? -eq 0 ]; then + echo "✅ Миграция $filename успешно применена" + # Записываем в таблицу migrations + PGPASSWORD=$DB_PASSWORD psql -h $DB_HOST -p $DB_PORT -U $DB_USERNAME -d $DB_NAME -c " + INSERT INTO migrations (name) VALUES ('$filename') + " 2>/dev/null + else + echo "❌ Ошибка при применении миграции $filename" + return 1 + fi + done + else + echo "⚠️ Директория $directory не найдена" + return 0 + fi + + return 0 +} + +# Применяем SQL миграции из всех возможных папок +echo "🔄 Применение SQL-миграций из src/database/migrations..." +apply_sql_files "src/database/migrations" + +echo "🔄 Применение SQL-миграций из migrations/sql..." +apply_sql_files "migrations/sql" + +echo "🔄 Применение SQL-миграций из migrations (если есть)..." +apply_sql_files "migrations" + +echo "✅ Процесс применения SQL-миграций завершен!" diff --git a/docs/migrations_fix.md b/docs/migrations_fix.md new file mode 100644 index 0000000..5bb98bf --- /dev/null +++ b/docs/migrations_fix.md @@ -0,0 +1,88 @@ +# Решение проблемы с миграциями базы данных + +## Проблемы + +При попытке применить миграции были обнаружены следующие проблемы: + +1. **Ошибка с TypeScript файлами**: Node.js не может напрямую выполнять файлы `.ts` без компиляции их в JavaScript. +2. **Предупреждения о ES модулях**: Файлы используют синтаксис ES модулей, но не имеют расширения `.mjs` или настроек в package.json. +3. **Неверный порядок миграций**: Миграции могут выполняться в неправильном порядке. + +## Решения + +### Для быстрого применения миграций + +Используйте один из следующих сценариев: + +```bash +# Полный процесс миграции с компиляцией TypeScript +./bin/run_full_migration.sh + +# Только SQL-миграции (минуя node-pg-migrate) +./bin/run_sql_migrations.sh +``` + +### Пошаговое решение + +1. **Компиляция TypeScript миграций в JavaScript**: + ```bash + ./bin/compile_ts_migrations.sh + ``` + +2. **Применение JS-миграций**: + ```bash + ./bin/apply_migrations.sh + ``` + +3. **Ручное применение SQL-миграций**: + ```bash + ./bin/run_sql_migrations.sh + ``` + +## Описание скриптов + +- **run_full_migration.sh**: Полный процесс миграции, включающий компиляцию TypeScript и применение всех миграций. +- **compile_ts_migrations.sh**: Только компиляция TypeScript миграций в JavaScript. +- **apply_migrations.sh**: Применение JS-миграций через node-pg-migrate. +- **run_sql_migrations.sh**: Прямое применение SQL-миграций через psql. + +## Проверка результатов + +После выполнения миграций проверьте состояние базы данных: + +```bash +# Подключение к базе данных +PGPASSWORD=$DB_PASSWORD psql -h $DB_HOST -p $DB_PORT -U $DB_USERNAME -d $DB_NAME + +# Проверка таблиц +\dt + +# Проверка примененных миграций +SELECT * FROM migrations ORDER BY executed_at; +``` + +## Если проблемы сохраняются + +1. **Очистить директорию миграций**: + ```bash + # Создание резервной копии + mkdir -p backup_migrations + cp -r migrations/* backup_migrations/ + + # Оставить только JS-миграции + rm -f migrations/*.ts + ``` + +2. **Инициализировать миграции заново**: + ```bash + npx node-pg-migrate init + ``` + +3. **Применить специальную консолидированную миграцию**: + ```bash + # Создание консолидированной миграции + cat src/database/migrations/*.sql > consolidated.sql + + # Применение консолидированной миграции + PGPASSWORD=$DB_PASSWORD psql -h $DB_HOST -p $DB_PORT -U $DB_USERNAME -d $DB_NAME -f consolidated.sql + ```