5. TRUNCATE 문을 수행하는 방법이 있나요?

SQL의 TRUNCATE 문은 표에 저장된 모든 항목을 제거하는 명령입니다. 장고는 TRUNCATE 문을 실행하는 명령을 제공하지 않습니다. 하지만 delete 메서드를 이용해 비슷한 결과를 얻을 수 있습니다.

다음 예를 보십시오.

>>> Category.objects.all().count()
7
>>> Category.objects.all().delete()
(7, {'entity.Category': 7})
>>> Category.objects.all().count()
0

위 코드는 잘 동작합니다. 하지만 TRUNCATE 문이 아니라 DELETE FROM ... 과 같은 SQL 질의를 수행합니다. 삭제해야 하는 항목의 수가 매우 많은 경우 처리 속도가 느릴 수 있습니다. truncate 명령이 필요하다면 다음과 같이 Category 모델에 classmethod 로 추가하면 됩니다.

class Category(models.Model):
    # ...

    @classmethod
    def truncate(cls):
        with connection.cursor() as cursor:
            cursor.execute('TRUNCATE TABLE "{0}" CASCADE'.format(cls._meta.db_table))

이렇게 메서드를 정의해 두면 Category.truncate() 를 실행하여 정말로 데이터베이스 시스템에 TRUNCATE 문을 질의할 수 있습니다.