[Django] Django ORM Cookbook : 8

GreenBean·2021년 9월 30일
0

Django ORM Cookbook

목록 보기
8/8
post-thumbnail

Django ORM

Django ORM Cookbook


질의 횟수 확인

  • 장고 단위 테스트 클래스의 assertNumQueries() 메서드를 사용하여 데이터베이스에 발생하는 질의 횟수를 검증할 수 있음
def test_number_of_queries(self):
    User.objects.create(username='testuser1', first_name='Test', last_name='user1')
    # 위 ORM 명령으로 질의 횟수가 1번 일어나야 함
    self.assertNumQueries(1)
    User.objects.filter(username='testuser').update(username='test1user')
    # 질의 횟수가 2번으로 증가해야 함
    self.assertNumQueries(2)

데이터베이스 재사용

  • python manage.py test 명령을 실행할 때마다 데이터베이스가 새로 생성
    • 이것은 마이그레이션이 많지 않을 때는 문제가 되지 않지만 마이그레이션이 많아질수록 테스트 실행 시 데이터베이스 재생성에 많은 시간을 소요하게 됨
    • 이런 상황을 피하기 위해 이전에 생성된 데이터베이스를 재사용할 수 있음
  • 테스트 명령에 --keepdb 플래그를 추가하여 데이터베이스가 삭제되는 것을 방지하고 테스트 실행 간 데이터베이스를 유지할 수 있음
    • 데이터베이스가 존재하지 않으면 데이터베이스를 새로 생성
    • 마지막 테스트 실행 이후 마이그레이션이 추가되었으면 최신 상태를 유지하기 위해 마이그레이션을 수행
  • $ python manage.py test --keepdb

모델 객체를 데이터베이스에서 읽기

  • refresh_from_db() 메서드를 사용하여 데이터베이스에서 모델을 다시 읽어들일 수 있음
  • 값을 갱신하는 테스트를 작성할 때 유용한 기능
class TestORM(TestCase):
    def test_update_result(self):
        userobject = User.objects.create(username='testuser', first_name='Test', last_name='user')
        User.objects.filter(username='testuser').update(username='test1user')
        # 이 때, userobject 인스턴스의 username은 'testuser'
        # 그러나 데이터베이스에서는 'test1user'로 수정되었음
        # 모델 인스턴스의 속성이 데이터베이스와 맞지 않으므로 다시 읽어들임
        userobject.refresh_from_db()
        self.assertEqual(userobject.username, 'test1user')
profile
🌱 Backend-Dev | hwaya2828@gmail.com

0개의 댓글