# Database Schema Fixes ## Обзор исправлений Этот документ описывает исправления схемы базы данных, примененные к проекту Telegram Tinder Bot для устранения критических ошибок и предупреждений. ## Дата последнего обновления: 2025-11-06 --- ## Исправление 1: Колонка `looking_for` и триггер создания профиля ### Проблема ``` ERROR: null value in column "looking_for" of relation "profiles" violates not-null constraint ``` ### Причина Триггер `create_initial_profile()` не устанавливал значение для обязательного поля `looking_for` при автоматическом создании профиля. ### Решение Применен патч: `sql/fix_looking_for_column.sql` **Изменения:** 1. Обновлен триггер для включения `looking_for = 'both'` и `interested_in = 'both'` 2. Сделана колонка `looking_for` необязательной (nullable) с DEFAULT 'both' 3. Добавлена колонка `interested_in` как современный синоним для `looking_for` 4. Создан индекс для поиска: `idx_profiles_interested_in` **Применение:** ```bash PGPASSWORD='your_password' psql -h host -p 5432 -U user -d db_name -f sql/fix_looking_for_column.sql ``` --- ## Исправление 2: Колонка `job` и `state` ### Проблема 1: Column "job" does not exist ``` ERROR: column "job" of relation "profiles" does not exist ``` **Причина:** Код использует `job`, но в БД создана колонка `occupation`. ### Проблема 2: State column does not exist ``` WARNING: State column does not exist in users table. Skipping state check. ``` **Причина:** Таблица `users` не содержит колонку `state` для отслеживания состояния диалога. ### Решение Применен патч: `sql/add_job_and_state_columns.sql` **Изменения:** 1. Добавлена колонка `job VARCHAR(255)` в таблицу `profiles` 2. Скопированы данные из `occupation` → `job` для обратной совместимости 3. Добавлена колонка `state VARCHAR(50)` в таблицу `users` 4. Созданы индексы: `idx_profiles_job`, `idx_users_state` **Применение:** ```bash PGPASSWORD='your_password' psql -h host -p 5432 -U user -d db_name -f sql/add_job_and_state_columns.sql ``` --- ## Полная последовательность применения патчей Для нового развертывания применяйте патчи в следующем порядке: ```bash # 1. Основная схема (если еще не применена) PGPASSWORD='your_password' psql -h host -p 5432 -U user -d db_name -f sql/consolidated.sql # 2. Исправление looking_for PGPASSWORD='your_password' psql -h host -p 5432 -U user -d db_name -f sql/fix_looking_for_column.sql # 3. Добавление job и state PGPASSWORD='your_password' psql -h host -p 5432 -U user -d db_name -f sql/add_job_and_state_columns.sql ``` Или используйте автоматизированную команду: ```bash make migrate ``` --- ## Проверка применения исправлений ### Проверка триггера looking_for ```sql SELECT proname, prosrc FROM pg_proc WHERE proname = 'create_initial_profile'; ``` Должен содержать: `looking_for = 'both', interested_in = 'both'` ### Проверка колонок ```sql -- Проверка profiles SELECT column_name, data_type, is_nullable, column_default FROM information_schema.columns WHERE table_name = 'profiles' AND column_name IN ('job', 'occupation', 'looking_for', 'interested_in') ORDER BY column_name; -- Проверка users SELECT column_name, data_type, is_nullable FROM information_schema.columns WHERE table_name = 'users' AND column_name = 'state'; ``` ### Проверка индексов ```sql SELECT indexname, tablename, indexdef FROM pg_indexes WHERE tablename IN ('profiles', 'users') AND indexname IN ('idx_profiles_job', 'idx_users_state', 'idx_profiles_interested_in') ORDER BY tablename, indexname; ``` --- ## Известные предупреждения (неопасные) ### ES Module в миграциях ``` SyntaxError: Unexpected token 'export' ``` **Статус:** Не критично. Миграции применяются через psql напрямую, а не через node-pg-migrate. **Причина:** Файлы миграций в `/migrations` используют ES6 синтаксис, несовместимый с node-pg-migrate в режиме CommonJS. **Решение:** Используйте `make migrate` или применяйте SQL патчи напрямую через psql. ### DEEPSEEK_API_KEY not found ``` ⚠️ DEEPSEEK_API_KEY not found in environment variables ``` **Статус:** Не критично. Это опциональная AI-функция. **Решение:** Добавьте `DEEPSEEK_API_KEY=your_key` в `.env` если хотите использовать AI-фичи. --- ## Mapping колонок (для справки) | Код (TypeScript) | База данных | Комментарий | |------------------|-------------|-------------| | `job` | `job` | Основная колонка (новая) | | `job` | `occupation` | Устаревшая, оставлена для совместимости | | `interestedIn` | `interested_in` | Основная колонка (новая) | | `lookingFor` | `looking_for` | Устаревшая, nullable | | - | `state` | Новая колонка для users.state | --- ## Контакты для поддержки При возникновении проблем с миграциями: 1. Проверьте логи бота: `docker compose logs bot --tail 50` 2. Проверьте применение всех патчей (см. раздел "Проверка") 3. Убедитесь, что `.env` содержит правильные DB_* переменные 4. Попробуйте применить патчи вручную через psql **Версия документа:** 1.0 **Автор:** GitHub Copilot **Дата:** 2025-11-06