CRUD
주피터 사용시 모델에 대한 정보는 Profile?? 와 같은 명령을 통해 알 수 있음. 주피터는 사용하는 모델을 자동으로 임포트함.
조회(Retrieve)
- 포함된 텍스트가 제목에 들어간 쿼리셋(i: 대소문자 구별 무시)
And 조건
- 위조건에 추가여 끝문장으로 끝나는 제목을 가진 텍스트
- queryset=Post.objects.all().filter(title__icontains=”포함된 텍스트”,title__endswith=”끝문장”) : 같은 조건임
Post.objects.all().filter(title__icontains=”포함된 텍스트”).exclude(title–endswith=”끝제외”)
- 포함된 텍스트로 시작하는 것중 끝제외로 끝나는 것을 제외한 쿼리셋
Or 조건
-
위 과정에서 DB Access는 이루어지지 않음. 실제 print같은 명령이 있을 때 접근함.
-
검색기능 구현
- 데이터베이스에 정렬 조건 추가
Fetch
- queryset.get(id=1)
- 해당조건이 1개가 아니면 예외발생
- queryset.first() 또는 queryset.last()
- 조건에 맞는게 없어도 예외발생하지 않고 None을 리턴
추가(Create)
-
Model instance의 save()를 이용 instance = Post(name=”hvo”, title=”create”) # 저장전 instance.save() # 비로소 저장됨
-
Model Manager의 create 를 이용 Post.objects.create(name=”hvo”, title=”create”)
- 추가된 쿼리셋 반환
갱신(Update)
- 속성변경후 save()를 이용
post = Post.objects.get(id=1)
post.tags = “tag변경”
post.save()
- 다수 row에 대해 각각하면 성능저하 발생
- QuerySet의 update 이용
queryset=Post.objects.all()
queryset.update(tag=”tag변경”)
- 변경된 개수를 리턴함.
- 다수의 변경을 하나의 SQL로 전달함.
삭제(Delete)
-
instance에 delete 호출 post = Post.objects.get(id=1) post.delete
-
QuerySet의 delete함수를 호출 queryset = Post.objects.all() queryset.delete()
Tip
- 위의 경우를 살펴보면 1의 방법은 하나의 쿼리셋을 찾고 이에 대한 작업실시. 즉 여러개의 쿼리에 대해서는 for문을 이용하여 돌려야 하는데 이때 각각의 작업에 SQL이 작성되므로 성능저하됨.
- 2의 방법이 훨씬 효율적임.
- 요청반응속도는 대부분 DB에서 결정됨.
Leave a Comment