#!/bin/bash # apply_direct_sql.sh - Прямое выполнение SQL-миграций с помощью psql 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 # Создаем консолидированный SQL-файл echo "📝 Создание консолидированного SQL-файла..." consolidated_sql="consolidated_migration.sql" cat > "$consolidated_sql" << EOL -- Консолидированная миграция для Telegram Tinder Bot -- Создана автоматически: $(date) -- Создаем таблицу migrations, если её еще нет CREATE TABLE IF NOT EXISTS migrations ( id SERIAL PRIMARY KEY, name VARCHAR(255) NOT NULL, executed_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); -- Основная структура базы данных -- Таблица пользователей CREATE TABLE IF NOT EXISTS users ( id BIGINT PRIMARY KEY, username VARCHAR(255), first_name VARCHAR(255), last_name VARCHAR(255), language_code VARCHAR(10), is_bot BOOLEAN DEFAULT FALSE, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, state VARCHAR(50) DEFAULT 'START', state_data JSONB, gender VARCHAR(10), looking_for VARCHAR(10), bio TEXT, age INTEGER, location VARCHAR(255), photos JSONB DEFAULT '[]'::jsonb, interests TEXT[], premium BOOLEAN DEFAULT FALSE, premium_expires_at TIMESTAMP ); -- Таблица профилей CREATE TABLE IF NOT EXISTS profiles ( id SERIAL PRIMARY KEY, user_id BIGINT REFERENCES users(id) ON DELETE CASCADE, name VARCHAR(255), age INTEGER, gender VARCHAR(10), bio TEXT, photos JSONB DEFAULT '[]'::jsonb, interests TEXT[], location VARCHAR(255), religion VARCHAR(50), education VARCHAR(255), job VARCHAR(255), height INTEGER, smoking VARCHAR(50), drinking VARCHAR(50), looking_for VARCHAR(10), created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); -- Таблица лайков CREATE TABLE IF NOT EXISTS likes ( id SERIAL PRIMARY KEY, from_user_id BIGINT REFERENCES users(id) ON DELETE CASCADE, to_user_id BIGINT REFERENCES users(id) ON DELETE CASCADE, is_like BOOLEAN NOT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, UNIQUE(from_user_id, to_user_id) ); -- Таблица матчей CREATE TABLE IF NOT EXISTS matches ( id SERIAL PRIMARY KEY, user1_id BIGINT REFERENCES users(id) ON DELETE CASCADE, user2_id BIGINT REFERENCES users(id) ON DELETE CASCADE, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, active BOOLEAN DEFAULT TRUE, UNIQUE(user1_id, user2_id) ); -- Таблица сообщений CREATE TABLE IF NOT EXISTS messages ( id SERIAL PRIMARY KEY, match_id INTEGER REFERENCES matches(id) ON DELETE CASCADE, sender_id BIGINT REFERENCES users(id) ON DELETE CASCADE, message_text TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); -- Таблица просмотров профилей CREATE TABLE IF NOT EXISTS profile_views ( id SERIAL PRIMARY KEY, viewer_id BIGINT REFERENCES users(id) ON DELETE CASCADE, viewed_id BIGINT REFERENCES users(id) ON DELETE CASCADE, viewed_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, UNIQUE(viewer_id, viewed_id) ); -- Таблица уведомлений CREATE TABLE IF NOT EXISTS notifications ( id SERIAL PRIMARY KEY, user_id BIGINT REFERENCES users(id) ON DELETE CASCADE, type VARCHAR(50) NOT NULL, data JSONB, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, scheduled_for TIMESTAMP, processed BOOLEAN DEFAULT FALSE ); -- Индексы для оптимизации запросов -- Индексы для таблицы пользователей CREATE INDEX IF NOT EXISTS users_username_idx ON users(username); CREATE INDEX IF NOT EXISTS users_gender_idx ON users(gender); CREATE INDEX IF NOT EXISTS users_looking_for_idx ON users(looking_for); CREATE INDEX IF NOT EXISTS users_premium_idx ON users(premium); -- Индексы для таблицы лайков CREATE INDEX IF NOT EXISTS likes_from_user_id_idx ON likes(from_user_id); CREATE INDEX IF NOT EXISTS likes_to_user_id_idx ON likes(to_user_id); CREATE INDEX IF NOT EXISTS likes_is_like_idx ON likes(is_like); -- Индексы для таблицы матчей CREATE INDEX IF NOT EXISTS matches_user1_id_idx ON matches(user1_id); CREATE INDEX IF NOT EXISTS matches_user2_id_idx ON matches(user2_id); CREATE INDEX IF NOT EXISTS matches_active_idx ON matches(active); -- Индексы для таблицы сообщений CREATE INDEX IF NOT EXISTS messages_match_id_idx ON messages(match_id); CREATE INDEX IF NOT EXISTS messages_sender_id_idx ON messages(sender_id); -- Индексы для таблицы профилей CREATE INDEX IF NOT EXISTS profiles_user_id_idx ON profiles(user_id); CREATE INDEX IF NOT EXISTS profiles_gender_idx ON profiles(gender); CREATE INDEX IF NOT EXISTS profiles_looking_for_idx ON profiles(looking_for); -- Индексы для таблицы просмотров профилей CREATE INDEX IF NOT EXISTS profile_views_viewer_id_idx ON profile_views(viewer_id); CREATE INDEX IF NOT EXISTS profile_views_viewed_id_idx ON profile_views(viewed_id); -- Индексы для таблицы уведомлений CREATE INDEX IF NOT EXISTS notifications_user_id_idx ON notifications(user_id); CREATE INDEX IF NOT EXISTS notifications_scheduled_for_idx ON notifications(scheduled_for); CREATE INDEX IF NOT EXISTS notifications_processed_idx ON notifications(processed); -- Запись о выполнении миграции INSERT INTO migrations (name) VALUES ('consolidated_migration.sql') ON CONFLICT DO NOTHING; EOL echo "✅ Консолидированный SQL-файл создан: $consolidated_sql" # Вывод информации о подключении echo "🔍 Используемые параметры подключения:" echo "DB_HOST: $DB_HOST" echo "DB_PORT: $DB_PORT" echo "DB_NAME: $DB_NAME" echo "DB_USERNAME: $DB_USERNAME" echo "DB_PASSWORD: ********" # Проверка наличия psql if command -v psql >/dev/null; then echo "✅ Найдена команда psql, продолжаем..." else echo "⚠️ Команда psql не найдена, установите PostgreSQL клиент:" echo "apt-get update && apt-get install -y postgresql-client" exit 1 fi # Применение миграции echo "🔄 Применение консолидированной миграции..." export PGPASSWORD=$DB_PASSWORD psql -h $DB_HOST -p $DB_PORT -U $DB_USERNAME -d $DB_NAME -f "$consolidated_sql" # Проверка результата if [ $? -eq 0 ]; then echo "✅ Миграция успешно применена!" else echo "❌ Ошибка при применении миграции!" exit 1 fi # Удаление временного файла rm -f "$consolidated_sql" echo "🚀 Миграция базы данных завершена!"