- Добавлена колонка 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
6.5 KiB
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
Изменения:
- Обновлен триггер для включения
looking_for = 'both'иinterested_in = 'both' - Сделана колонка
looking_forнеобязательной (nullable) с DEFAULT 'both' - Добавлена колонка
interested_inкак современный синоним дляlooking_for - Создан индекс для поиска:
idx_profiles_interested_in
Применение:
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
Изменения:
- Добавлена колонка
job VARCHAR(255)в таблицуprofiles - Скопированы данные из
occupation→jobдля обратной совместимости - Добавлена колонка
state VARCHAR(50)в таблицуusers - Созданы индексы:
idx_profiles_job,idx_users_state
Применение:
PGPASSWORD='your_password' psql -h host -p 5432 -U user -d db_name -f sql/add_job_and_state_columns.sql
Полная последовательность применения патчей
Для нового развертывания применяйте патчи в следующем порядке:
# 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
Или используйте автоматизированную команду:
make migrate
Проверка применения исправлений
Проверка триггера looking_for
SELECT proname, prosrc
FROM pg_proc
WHERE proname = 'create_initial_profile';
Должен содержать: looking_for = 'both', interested_in = 'both'
Проверка колонок
-- Проверка 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';
Проверка индексов
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 |
Контакты для поддержки
При возникновении проблем с миграциями:
- Проверьте логи бота:
docker compose logs bot --tail 50 - Проверьте применение всех патчей (см. раздел "Проверка")
- Убедитесь, что
.envсодержит правильные DB_* переменные - Попробуйте применить патчи вручную через psql
Версия документа: 1.0
Автор: GitHub Copilot
Дата: 2025-11-06