>

TIL

DRF프로젝트에서 CSV 파일 사용하기

ekdud 2024. 9. 27. 17:47

📑

     

    csv파일 사용하기

    데이터 조회 기능이 있는 오픈 API를 이용하는 것보다 효율성 측면에서 파일을 직접 다운받아서 사용하는 것이 낫겠다는 판단을 내렸다.

     

    오픈 API를 이용하면 데이터가 업데이트될 때 우리 쪽에서 따로 업데이트 내용을 반영할 필요가 없다는 장점이 있지만 오픈 API에서 지원하지 않는 검색, 정렬 기능을 구현하는 부분에 있어서 오픈 API를 통해 데이터를 전부 받아오고 그걸 다시 정렬해야하다보니 너무 비효율적이었다. 그래서 그냥 처음부터 다시 구현을 시작하기로 했다... 그래도 오픈 API를 한번 사용해보았다는 것에 의의를 가지자..!! 이제 어떻게 쓰는지 알았으니 다른 부분에서 다른 오픈API를 사용하면 될 것 같다. 기본적인 구현이 끝나면 팀원분들에게 건의해봐야겠다

     


     

    데이터를 그냥 DB에 넣어두고 사용하는 게 좋을 것 같다는 의견에 다들 동의하셔서 일단 CSV파일을 DB에 넣는 파일을 하나 만들었다. ( Location 모델을 업데이트하거나 새로 생성하는 커스텀 Django Management 명령어)

    # 데이터베이스 업데이트 시, python manage.py import_locations 실행하여 db에 촬영지 데이터 넣기.
    import csv
    from locations.models import Location
    from django.core.management.base import BaseCommand
    
    
    class Command(BaseCommand):
        help = 'Import data from CSV file'
    
        def handle(self, *args, **kwargs):
            with open(r"C:\SceneTrip\한국문화정보원_미디어콘텐츠 영상 촬영지 데이터_20221125.csv", newline="", encoding="cp949") as csvfile:
                reader = csv.DictReader(csvfile)
                for row in reader:
                    location, created = Location.objects.update_or_create(
                        title=row["제목"],
                        place_name=row["장소명"],
                        place_description=row["장소설명"],
                        defaults = {
                        'media_type':row["미디어타입"],
                        'title':row["제목"],
                        'place_name':row["장소명"],
                        'place_type':row["장소타입"],
                        'place_description':row["장소설명"],
                        'opening_hours':row["영업시간"],
                        'break_time':row["브레이크타임"] if row["브레이크타임"] else None,
                        'closed_day':row["휴무일"],
                        'address':row["주소"],
                        'latitude':float(row["위도"]),
                        'longitude':float(row["경도"]),
                        'tel':row["전화번호"],
                        'created_at':row["최종작성일"],
                        }
                    )
                    if created:
                        self.stdout.write(self.style.SUCCESS(f'Created new location: {row["제목"]} - {row["장소명"]}'))

     

    터미널에 python manage.py import_locations.py 입력해서 실행하면

    현재 DB에 없는 데이터는 생성되고 이미 있는 데이터는 업데이트 됨.