SillaAMP_V2/B_main/clean_duplicates.py

102 lines
4.1 KiB
Python

#!/usr/bin/env python
"""
중복된 Person 데이터를 정리하는 스크립트
"""
import os
import sys
import django
# Django 설정
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'A_core.settings')
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
django.setup()
from B_main.models import Person
from django.contrib.auth.models import User
def clean_duplicates():
"""중복된 Person 데이터 정리"""
print("=" * 60)
print("중복 Person 데이터 정리")
print("=" * 60)
# 전화번호별로 그룹화
phone_groups = {}
for person in Person.objects.all():
if person.연락처:
if person.연락처 not in phone_groups:
phone_groups[person.연락처] = []
phone_groups[person.연락처].append(person)
deleted_count = 0
for phone, persons in phone_groups.items():
if len(persons) > 1:
print(f"\n전화번호 {phone}에 대한 중복 발견:")
# 회원가입 상태별로 분류
registered = [p for p in persons if p.회원가입상태 == '회원가입']
not_registered = [p for p in persons if p.회원가입상태 == '미가입']
withdrawn = [p for p in persons if p.회원가입상태 == '탈퇴']
print(f" 회원가입: {len(registered)}")
print(f" 미가입: {len(not_registered)}")
print(f" 탈퇴: {len(withdrawn)}")
# 정리 로직
if registered:
# 회원가입된 것이 있으면 나머지 삭제
keep_person = registered[0]
to_delete = persons[1:] # 첫 번째 것 제외하고 모두 삭제
print(f" 유지: {keep_person.이름} (ID: {keep_person.id}, 회원가입상태: {keep_person.회원가입상태})")
for person in to_delete:
print(f" 삭제: {person.이름} (ID: {person.id}, 회원가입상태: {person.회원가입상태})")
person.delete()
deleted_count += 1
elif not_registered:
# 미가입만 있으면 첫 번째 것만 유지
keep_person = not_registered[0]
to_delete = not_registered[1:] + withdrawn
print(f" 유지: {keep_person.이름} (ID: {keep_person.id}, 회원가입상태: {keep_person.회원가입상태})")
for person in to_delete:
print(f" 삭제: {person.이름} (ID: {person.id}, 회원가입상태: {person.회원가입상태})")
person.delete()
deleted_count += 1
elif withdrawn:
# 탈퇴만 있으면 첫 번째 것만 유지
keep_person = withdrawn[0]
to_delete = withdrawn[1:]
print(f" 유지: {keep_person.이름} (ID: {keep_person.id}, 회원가입상태: {keep_person.회원가입상태})")
for person in to_delete:
print(f" 삭제: {person.이름} (ID: {person.id}, 회원가입상태: {person.회원가입상태})")
person.delete()
deleted_count += 1
print(f"\n{deleted_count}개의 중복 데이터가 삭제되었습니다.")
# 최종 확인
print("\n최종 중복 확인:")
final_phone_counts = {}
for person in Person.objects.all():
if person.연락처:
final_phone_counts[person.연락처] = final_phone_counts.get(person.연락처, 0) + 1
final_duplicates = {phone: count for phone, count in final_phone_counts.items() if count > 1}
if final_duplicates:
print("여전히 중복된 전화번호가 있습니다:")
for phone, count in final_duplicates.items():
print(f" {phone}: {count}")
else:
print("모든 중복이 해결되었습니다.")
if __name__ == '__main__':
clean_duplicates()