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

View File

@@ -0,0 +1,36 @@
-- Добавление колонок job и state
-- Дата: 2025-11-06
-- Исправляет ошибки: "column job does not exist" и "State column does not exist"
-- 1. Добавляем колонку job в таблицу profiles (синоним для occupation)
ALTER TABLE profiles ADD COLUMN IF NOT EXISTS job VARCHAR(255);
-- 2. Копируем существующие данные из occupation в job
UPDATE profiles SET job = occupation WHERE occupation IS NOT NULL AND job IS NULL;
-- 3. Добавляем колонку state в таблицу users для отслеживания состояния диалога
ALTER TABLE users ADD COLUMN IF NOT EXISTS state VARCHAR(50);
-- 4. Создаём индексы для производительности
CREATE INDEX IF NOT EXISTS idx_profiles_job ON profiles(job);
CREATE INDEX IF NOT EXISTS idx_users_state ON users(state);
-- 5. Добавляем комментарии для документации
COMMENT ON COLUMN profiles.job IS 'Профессия/работа пользователя (синоним для occupation)';
COMMENT ON COLUMN profiles.occupation IS 'Профессия/работа пользователя (устаревшее, используйте job)';
COMMENT ON COLUMN users.state IS 'Текущее состояние пользователя в диалоге с ботом';
-- Проверка результата
SELECT
'profiles.job' as column_name,
CASE WHEN EXISTS (
SELECT 1 FROM information_schema.columns
WHERE table_name = 'profiles' AND column_name = 'job'
) THEN '✅ Существует' ELSE 'Не найдена' END as status
UNION ALL
SELECT
'users.state' as column_name,
CASE WHEN EXISTS (
SELECT 1 FROM information_schema.columns
WHERE table_name = 'users' AND column_name = 'state'
) THEN '✅ Существует' ELSE 'Не найдена' END as status;