1. bulk_create

  • 현재 진행중인 프로젝트인 op.gg 클론 코딩에서 티어별 통계 데이터를 보여주기 위해 해당 데이터를 크롤링 해와서 내가 원하는 데이터의 형식으로 바꾸어 저장하는데 까지는 성공. 그리고 이를 다시 mysql DB에 밀어넣는 코드에서 리뷰를 받은 사항을 공유한다.

    for n in range(len(tiers)):
          Tierstat(
              tier = tier_name[n],
              tier_numbers = tier_roman[n],
              summoner = summoner_count[n],
              summoner_percent = summoner_percentage[n],
              aggregate = aggregate_count[n],
              aggregate_percent = aggregate_percentage[n],
          ).save()
  • 이런식으로 save()를 사용할 경우, 데이터가 들어가는 n번 동안 DB에 연결하고 저장한후 연결을 끊는 작업을 각 회차마다 진행하게된다. 이런식의 코드는 DB에 많은 부하를 초래하기 때문에 bulk_create메소드를 사용하여 데이터를 한번에 집어넣는 방식으로 전환하였다.

    tierstats_list = []
      for n in range(len(tiers)):
          tierstat_object = Tierstat(
              tier = tier_name[n],
              tier_numbers = tier_roman[n],
              summoner = summoner_count[n],
              summoner_percent = summoner_percentage[n],
              aggregate = aggregate_count[n],
              aggregate_percent = aggregate_percentage[n],
          )
          tierstats_list.append(tierstat_object)                              
      Tierstat.objects.bulk_create(tierstats_list)
  • tierstats_list에 for문으로 각각 Tierstat 딕셔너리를 만들어 추가해준다. 이후 만들어진 리스트를 bulk_create로 집어넣어주면, 리스트에 있는 딕셔너리가 한꺼번에 DB로 입력된다.

2. mysql-connector-python version관련 에러

  • 크롤링한 데이터를 DB에 저장해준 후, 정상적으로 읽어와서 전달해줄 수 있는지 확인해 보기 위해 shell에서 다음과 같은 코드를 입력했다.

    Tierstat.objects.all()
  • 여기서 발생한 에러메시지는 다음과 같다.

    AttributeError: 'decimal.Decimal' object has no attribute 'decode'
  • 애초에 django ORM을 활용하여 데이터 입력은 정상적으로 되었는데, 읽어오는 과정만 못하는 것이 잘못되었을리는 없을 것 같아서 구글링을 해보니, mysql-python-connector의 버전문제로(8.0.13이후 부터 발생하는것으로 확인) 해당 현상이 발생할 수 있다는 결과를 찾을 수가 있었다. 해서 조치한것은 하나.

    pip install mysql-python-connector==8.0.12
  • 이후에는 해당 명령어가 정상작동하는 것으로 확인...

    <QuerySet [<Tierstat: Tierstat object (1)>, 
    <Tierstat: Tierstat object (2)>, 
    <Tierstat: Tierstat object (3)>, 
    <Tierstat: Tierstat object (4)>, 
    <Tierstat: Tierstat object (5)>, 
    '...(remaining elements truncated)...']>