ваше сообщение коммита
This commit is contained in:
56
backend/db/migrations/015_users_table_refactor.sql
Normal file
56
backend/db/migrations/015_users_table_refactor.sql
Normal file
@@ -0,0 +1,56 @@
|
||||
-- Миграция для изменения структуры таблицы users
|
||||
-- Переносим данные из email и address в user_identities, затем преобразуем эти поля в first_name и last_name
|
||||
|
||||
-- Сначала проверяем, что все email и address уже существуют в user_identities
|
||||
DO $$
|
||||
BEGIN
|
||||
-- Переносим email в user_identities, если еще не перенесены
|
||||
INSERT INTO user_identities (user_id, provider, provider_id)
|
||||
SELECT id, 'email', email
|
||||
FROM users
|
||||
WHERE email IS NOT NULL
|
||||
AND NOT EXISTS (
|
||||
SELECT 1 FROM user_identities
|
||||
WHERE user_id = users.id AND provider = 'email' AND provider_id = users.email
|
||||
);
|
||||
|
||||
-- Переносим address в user_identities, если еще не перенесены
|
||||
INSERT INTO user_identities (user_id, provider, provider_id)
|
||||
SELECT id, 'wallet', address
|
||||
FROM users
|
||||
WHERE address IS NOT NULL
|
||||
AND NOT EXISTS (
|
||||
SELECT 1 FROM user_identities
|
||||
WHERE user_id = users.id AND provider = 'wallet' AND provider_id = users.address
|
||||
);
|
||||
|
||||
-- Логируем результаты миграции
|
||||
RAISE NOTICE 'Данные из колонок email и address перенесены в таблицу user_identities';
|
||||
END $$;
|
||||
|
||||
-- Теперь изменяем структуру таблицы users
|
||||
ALTER TABLE users
|
||||
DROP CONSTRAINT IF EXISTS users_email_key,
|
||||
DROP CONSTRAINT IF EXISTS users_address_key;
|
||||
|
||||
-- Добавляем временные колонки
|
||||
ALTER TABLE users
|
||||
ADD COLUMN first_name VARCHAR(255),
|
||||
ADD COLUMN last_name VARCHAR(255);
|
||||
|
||||
-- Убираем уникальность и переименовываем колонки email и address
|
||||
ALTER TABLE users
|
||||
ALTER COLUMN email DROP NOT NULL,
|
||||
ALTER COLUMN address DROP NOT NULL;
|
||||
|
||||
-- Удаляем колонки email и address
|
||||
ALTER TABLE users
|
||||
DROP COLUMN email,
|
||||
DROP COLUMN address;
|
||||
|
||||
-- Добавляем комментарии к столбцам
|
||||
COMMENT ON COLUMN users.first_name IS 'Имя пользователя';
|
||||
COMMENT ON COLUMN users.last_name IS 'Фамилия пользователя';
|
||||
|
||||
-- Обновляем статистику таблицы
|
||||
ANALYZE users;
|
||||
93
backend/db/migrations/016_fix_duplicate_identities.sql
Normal file
93
backend/db/migrations/016_fix_duplicate_identities.sql
Normal file
@@ -0,0 +1,93 @@
|
||||
-- Миграция для исправления дублирующихся записей в user_identities из-за разного регистра букв
|
||||
-- Исправляем записи для провайдеров wallet и email
|
||||
|
||||
-- Сначала удаляем существующее ограничение уникальности
|
||||
ALTER TABLE user_identities DROP CONSTRAINT IF EXISTS user_identities_provider_provider_id_key;
|
||||
|
||||
-- Создаем временную таблицу для хранения идентификаторов, которые нужно обработать
|
||||
CREATE TEMP TABLE duplicate_identities AS
|
||||
SELECT
|
||||
provider,
|
||||
LOWER(provider_id) as normalized_provider_id,
|
||||
array_agg(id) as id_list,
|
||||
array_agg(user_id) as user_id_list
|
||||
FROM user_identities
|
||||
WHERE provider IN ('wallet', 'email')
|
||||
GROUP BY provider, LOWER(provider_id)
|
||||
HAVING COUNT(*) > 1;
|
||||
|
||||
-- Логируем количество найденных дубликатов
|
||||
DO $$
|
||||
DECLARE
|
||||
duplicate_count INTEGER;
|
||||
BEGIN
|
||||
SELECT COUNT(*) INTO duplicate_count FROM duplicate_identities;
|
||||
RAISE NOTICE 'Найдено % групп дублирующихся идентификаторов', duplicate_count;
|
||||
END $$;
|
||||
|
||||
-- Обновляем все записи, приводя provider_id к нижнему регистру
|
||||
UPDATE user_identities
|
||||
SET provider_id = LOWER(provider_id)
|
||||
WHERE provider IN ('wallet', 'email');
|
||||
|
||||
-- Удаляем дублирующиеся записи, оставляя только одну для каждой комбинации (provider, provider_id)
|
||||
WITH
|
||||
duplicates AS (
|
||||
SELECT
|
||||
id,
|
||||
provider,
|
||||
provider_id,
|
||||
ROW_NUMBER() OVER (
|
||||
PARTITION BY provider, provider_id
|
||||
ORDER BY id
|
||||
) as row_num
|
||||
FROM user_identities
|
||||
WHERE provider IN ('wallet', 'email')
|
||||
)
|
||||
DELETE FROM user_identities
|
||||
WHERE id IN (
|
||||
SELECT id FROM duplicates WHERE row_num > 1
|
||||
);
|
||||
|
||||
-- Удаляем дублирующиеся записи для одного пользователя
|
||||
WITH
|
||||
user_duplicates AS (
|
||||
SELECT
|
||||
id,
|
||||
user_id,
|
||||
provider,
|
||||
provider_id,
|
||||
ROW_NUMBER() OVER (
|
||||
PARTITION BY user_id, provider, provider_id
|
||||
ORDER BY id
|
||||
) as row_num
|
||||
FROM user_identities
|
||||
WHERE provider IN ('wallet', 'email')
|
||||
)
|
||||
DELETE FROM user_identities
|
||||
WHERE id IN (
|
||||
SELECT id FROM user_duplicates WHERE row_num > 1
|
||||
);
|
||||
|
||||
-- Добавляем обратно ограничение уникальности
|
||||
ALTER TABLE user_identities
|
||||
ADD CONSTRAINT user_identities_provider_provider_id_key
|
||||
UNIQUE (provider, provider_id);
|
||||
|
||||
-- Добавляем уникальный индекс для пользователей
|
||||
DO $$
|
||||
BEGIN
|
||||
IF NOT EXISTS (
|
||||
SELECT 1 FROM pg_indexes
|
||||
WHERE tablename = 'user_identities' AND indexname = 'unique_idx_user_identities_user_provider_provider_id'
|
||||
) THEN
|
||||
CREATE UNIQUE INDEX unique_idx_user_identities_user_provider_provider_id
|
||||
ON user_identities(user_id, provider, provider_id);
|
||||
END IF;
|
||||
END $$;
|
||||
|
||||
-- Логируем завершение миграции
|
||||
DO $$
|
||||
BEGIN
|
||||
RAISE NOTICE 'Миграция для исправления дублирующихся идентификаторов завершена';
|
||||
END $$;
|
||||
40
backend/db/migrations/fix_duplicates_manual.sql
Normal file
40
backend/db/migrations/fix_duplicates_manual.sql
Normal file
@@ -0,0 +1,40 @@
|
||||
-- Скрипт для ручного исправления дублирующихся записей в базе данных
|
||||
|
||||
-- 1. Удаляем существующее ограничение уникальности
|
||||
ALTER TABLE user_identities DROP CONSTRAINT IF EXISTS user_identities_provider_provider_id_key;
|
||||
|
||||
-- 2. Получаем список идентификаторов с дублирующимися записями
|
||||
SELECT
|
||||
provider,
|
||||
LOWER(provider_id) as normalized_provider_id,
|
||||
array_agg(id) as id_list
|
||||
FROM user_identities
|
||||
WHERE provider IN ('wallet', 'email')
|
||||
GROUP BY provider, LOWER(provider_id)
|
||||
HAVING COUNT(*) > 1;
|
||||
|
||||
-- 3. Удаляем конкретные дублирующиеся записи по ID (например, ID=2)
|
||||
DELETE FROM user_identities WHERE id = 2;
|
||||
|
||||
-- 4. Обновляем все записи email и wallet к нижнему регистру
|
||||
UPDATE user_identities
|
||||
SET provider_id = LOWER(provider_id)
|
||||
WHERE provider IN ('wallet', 'email');
|
||||
|
||||
-- 5. Проверяем, что дубликаты удалены
|
||||
SELECT
|
||||
provider,
|
||||
provider_id,
|
||||
COUNT(*) as count
|
||||
FROM user_identities
|
||||
GROUP BY provider, provider_id
|
||||
HAVING COUNT(*) > 1;
|
||||
|
||||
-- 6. Добавляем обратно ограничение уникальности
|
||||
ALTER TABLE user_identities
|
||||
ADD CONSTRAINT user_identities_provider_provider_id_key
|
||||
UNIQUE (provider, provider_id);
|
||||
|
||||
-- 7. Создаем дополнительный индекс для (user_id, provider, provider_id)
|
||||
CREATE UNIQUE INDEX IF NOT EXISTS unique_idx_user_identities_user_provider_provider_id
|
||||
ON user_identities(user_id, provider, provider_id);
|
||||
Reference in New Issue
Block a user