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:
36
sql/add_job_and_state_columns.sql
Normal file
36
sql/add_job_and_state_columns.sql
Normal 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;
|
||||
43
sql/fix_looking_for_column.sql
Normal file
43
sql/fix_looking_for_column.sql
Normal file
@@ -0,0 +1,43 @@
|
||||
-- Исправление триггера create_initial_profile и колонки looking_for
|
||||
-- Дата: 2025-11-06
|
||||
|
||||
-- 1. Удаляем старую функцию триггера
|
||||
DROP FUNCTION IF EXISTS create_initial_profile() CASCADE;
|
||||
|
||||
-- 2. Создаём исправленную функцию с полем looking_for
|
||||
CREATE OR REPLACE FUNCTION create_initial_profile()
|
||||
RETURNS TRIGGER AS $$
|
||||
BEGIN
|
||||
INSERT INTO profiles (user_id, name, age, gender, looking_for, interested_in)
|
||||
VALUES (NEW.id, COALESCE(NEW.first_name, 'User'), 18, 'other', 'both', 'both');
|
||||
|
||||
RETURN NEW;
|
||||
END;
|
||||
$$ LANGUAGE plpgsql;
|
||||
|
||||
-- 3. Пересоздаём триггер
|
||||
DROP TRIGGER IF EXISTS create_profile_on_user_insert ON users;
|
||||
DROP TRIGGER IF EXISTS create_profile_trigger ON users;
|
||||
|
||||
CREATE TRIGGER create_profile_on_user_insert
|
||||
AFTER INSERT ON users
|
||||
FOR EACH ROW
|
||||
EXECUTE FUNCTION create_initial_profile();
|
||||
|
||||
-- 4. Делаем looking_for необязательным с дефолтным значением
|
||||
ALTER TABLE profiles ALTER COLUMN looking_for DROP NOT NULL;
|
||||
ALTER TABLE profiles ALTER COLUMN looking_for SET DEFAULT 'both';
|
||||
|
||||
-- 5. Добавляем interested_in как синоним для looking_for
|
||||
ALTER TABLE profiles ADD COLUMN IF NOT EXISTS interested_in VARCHAR(20) DEFAULT 'both'
|
||||
CHECK (interested_in IN ('male', 'female', 'both'));
|
||||
|
||||
-- 6. Обновляем существующие записи
|
||||
UPDATE profiles SET looking_for = 'both' WHERE looking_for IS NULL;
|
||||
UPDATE profiles SET interested_in = COALESCE(looking_for, 'both') WHERE interested_in IS NULL;
|
||||
|
||||
-- 7. Создаём индекс для поиска по interested_in
|
||||
CREATE INDEX IF NOT EXISTS idx_profiles_interested_in ON profiles(interested_in);
|
||||
|
||||
COMMENT ON COLUMN profiles.looking_for IS 'Предпочитаемый пол для знакомства (устаревшее, используйте interested_in)';
|
||||
COMMENT ON COLUMN profiles.interested_in IS 'Предпочитаемый пол для знакомства: male, female, both';
|
||||
Reference in New Issue
Block a user