fix(database): Исправлены критические ошибки БД - job, state, looking_for

- Добавлена колонка job в profiles (устраняет ошибку column job does not exist)
- Добавлена колонка state в users (устраняет предупреждения State column does not exist)
- Исправлен триггер create_initial_profile() для включения looking_for
- Колонка looking_for сделана nullable с DEFAULT 'both'
- Добавлена колонка interested_in как современный синоним для looking_for
- Созданы индексы для производительности: idx_profiles_job, idx_users_state, idx_profiles_interested_in

Патчи:
- sql/fix_looking_for_column.sql
- sql/add_job_and_state_columns.sql

Утилиты:
- bin/apply_all_patches.sh - автоматическое применение всех патчей

Документация:
- docs/DATABASE_FIXES.md - подробное описание исправлений
- docs/HEALTH_CHECK.md - чеклист проверки здоровья бота
- docs/FIXES_SUMMARY_2025-11-06.md - краткая сводка изменений

Fixes: #job-column-error #state-column-warning #looking-for-constraint
This commit is contained in:
2025-11-06 10:30:35 +09:00
parent 9281388959
commit 88d9ccd75d
7 changed files with 721 additions and 0 deletions

176
docs/DATABASE_FIXES.md Normal file
View File

@@ -0,0 +1,176 @@
# 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