해결된 질문
작성
·
195
0
for chunks in get_chunks(zipcode_list, chunk_size=1000):
print("chunk size:", len(list(chunks)))
ZipCode.objects.bulk_create(chunks)
https://gist.github.com/allieus/f16d5d35b84d418cbabcfed8e69b96e2
깃허브 Gist에 올라온 코드를 그대로 복사 붙여넣기 하고 마이그레이트를 했더니 데이터 베이스에 데이터가 삽입이 안되었습니다.
그래서 디버깅을 해보았는데 위에 해당 코드블럭 부분에서 print("chunk size:", len(list(chunks)))은 그저 디버깅을 위한 코드일텐데 해당 구문이 bulk_create 보다 먼저 선언 되어있다면 데이터 삽입이 이루어지지 않습니다.
Django 버전 문제인가 싶어서 5.0.4에서 4.2.7로 버전을 내린 다음 해봐도 결과는 같네요.
제너레이터 문법은 이번 강의에서 처음 접하였는데 해당 문법과 연관이 있는것인가요?
답변 2
0
0
안녕하세요.
print("chunk size: ", len(list(chunks))) 코드는 단지 디버깅을 위한 코드가 아닙니다. chunks 는 Generator이구요. list(chunks)를 통해 값을 모두 생성해버렸기 때문에, 그 아래의 bulk_create(chunks) 에서는 더 이상 chunks 에서 생성해낼 값이 없는 상황입니다.
이 경우, 아래처럼 chunks Generator로부터 값을 한 번 생성할 때, 리스트로 먼저 저장하신 후에 길이를 출력하고 활용하실 수 있습니다. :-)
for chunks in get_chunks(zipcode_list, chunk_size=1000):
chunks_list = list(chunks)
print("chunk size:", len(chunks_list))
ZipCode.objects.bulk_create(chunks_list)
해당 프린트 구문에서 값을 전부 소진하여서 bulk_create 라인에서는 더 이상 수행할 값이 없으니 그대로 종료 되는거였군요. 덕분에 제너레이터가 어떻게 동작하게 되는지 확실히 알게되었습니다 감사합니다!