migrations fix
This commit is contained in:
@@ -42,14 +42,34 @@ else
|
|||||||
echo "⚠️ Утилита pg_isready не найдена, пропускаем проверку"
|
echo "⚠️ Утилита pg_isready не найдена, пропускаем проверку"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# Копирование миграций JS в отдельную директорию
|
||||||
|
echo "📂 Копирование только JS-миграций во временную директорию..."
|
||||||
|
mkdir -p temp_migrations
|
||||||
|
find migrations -name "*.js" -exec cp {} temp_migrations/ \;
|
||||||
|
|
||||||
# Применение миграций
|
# Применение миграций
|
||||||
echo "🔄 Применение миграций с помощью node-pg-migrate..."
|
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
|
if [ $? -eq 0 ]; then
|
||||||
echo "✅ Миграции успешно применены!"
|
echo "✅ Миграции успешно применены!"
|
||||||
else
|
else
|
||||||
echo "❌ Ошибка при применении миграций!"
|
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
|
fi
|
||||||
|
|
||||||
|
# Очистка временных файлов
|
||||||
|
echo "🧹 Очистка временных файлов..."
|
||||||
|
rm -rf temp_migrations
|
||||||
|
|||||||
46
bin/compile_ts_migrations.sh
Normal file
46
bin/compile_ts_migrations.sh
Normal file
@@ -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
|
||||||
37
bin/run_full_migration.sh
Normal file
37
bin/run_full_migration.sh
Normal file
@@ -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
|
||||||
101
bin/run_sql_migrations.sh
Normal file
101
bin/run_sql_migrations.sh
Normal file
@@ -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-миграций завершен!"
|
||||||
88
docs/migrations_fix.md
Normal file
88
docs/migrations_fix.md
Normal file
@@ -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
|
||||||
|
```
|
||||||
Reference in New Issue
Block a user