Files
tg_tinder_bot/docs/DATABASE_FIXES.md
Andrew K. Choi 88d9ccd75d 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
2025-11-06 10:30:35 +09:00

6.5 KiB
Raw Permalink Blame History

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

Применение:

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. Скопированы данные из occupationjob для обратной совместимости
  3. Добавлена колонка state VARCHAR(50) в таблицу users
  4. Созданы индексы: 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

Контакты для поддержки

При возникновении проблем с миграциями:

  1. Проверьте логи бота: docker compose logs bot --tail 50
  2. Проверьте применение всех патчей (см. раздел "Проверка")
  3. Убедитесь, что .env содержит правильные DB_* переменные
  4. Попробуйте применить патчи вручную через psql

Версия документа: 1.0
Автор: GitHub Copilot
Дата: 2025-11-06