본문 바로가기
First step/web depeloper step1

Dr Jart 클론 프로젝트 간 새롭게 사용한 것

by Joshua21 2021. 12. 7.

1. Aggregate 와 Annotate

Aggregate
테이블명.objects.filter(필드조건).aggregate(가공함수('필드명'))

테이블의 여러 레코드들에 대한 필드값을 가공하여(ex.sum avg 등) 객체값으로 반환한다.

Annotate
테이블명.objects.filter(필드조건).annotate(필드명 = 가공함수(필드값))

테이블의 여러 레코드들에 대한 컬럼값들을 가공하여 일시적으로 하나의 필드로 추가한다. 반환값은 각 레코드들의 컬럼속성이 추가된 QuerySet이된다.

2. F 와 Q

from django.db.models import F, Q

F
테이블명.objects.filter(필드조건).update(필드명 = F('필드명') -,/,*,+ ...)

Field의 약어로 필드값을 F('필드명')으로 불러올수 있다.

단일 객체 및 QuerySet 둘다 가공이 가능하다.

Q
테이블명.objects.filter(Q(필드명 = '필드값') |,&,~ Q(필드명 = '필드값'))

Query의 약어로 조건 ORM을 사용할때 사용된다.

~Q()는 EXCLUDE, Q() & Q() 은 AND, Q() | Q() 는 OR로 동작한다.

Select_related
테이블명.objects.select_related('정참조된 테이블명').all()

정참조(1 : 1, N : 1)를 하고 있는 테이블에서 다른 테이블의 데이터를 미리 INNER JOIN 으로 가져와서 하나의 테이블로 볼 수 있다. (SQL 단계에서 가져옴)

Prefetch_related
테이블명.objects.prefetch_related('역참조된 테이블명').all()

역참조(N : N, N : 1)를 하고 있는 테이블에서 다른 테이블의 데이터를 ORM 단계에서 미리 가져와서 하나의 테이블로 볼 수 있다.

 

MySQL - 테이블 내용 삭제 - DELETE, TRUNCATE

1. DELETE

1) 데이터만 삭제 되고 용량이 줄어들지 않습니다

2) 삭제한 내용을 되돌릴 수 있습니다

3) 전체 데이터 혹은 일부만 삭제가 가능합니다

4) TRUNCATE의 비해 속도가 느립니다

사용법 : DELETE TABLE [테이블명] WHERE [컬럼명] = [컬럼]

 

2. TRUNCATE

1) 테이블의 초기상태로 되돌립니다

2) 용량이 줄어들고, 인덱스 등등 도 삭제됩니다

3) 삭제 후 되돌릴수 없습니다

4) 전체 삭제만 가능합니다

사용법 : TRUNCATE [테이블명]

 

외래키가 있는 테이블 삭제할 경우

mysql> SET foreign_key_checks = 0; // 체크 해제
mysql> DELETE TABLE [테이블명] or TRUNCATE [테이블명]
mysql> SET foreign_key_checks = 1; // 다시 체크 설정

 

select_related 와 prefetch_related를 사용한 데이터 참조

Selected_related는 SQL Query 문의 JOIN 을 사용하여 foreign-key(one to one, many to one)를 사용하여 정참조할 때 사용하며 QuerySet을 가져올 때, 미리 related objects까지 불러오는 함수이다.

비록 쿼리는 복잡해지지만 불러온 data들은 데이터베이스 서버가 종료되기 전 까지 Cache에 남게되어 매 쿼리마다 DB에 접근하지 않아도 된다. 

셀렉트할 객체가 역참조하는 single object(one-to-one or many-to-one)이거나, 또는 정참조 foreign key 일 때 사용한다.select_related는 각각의 lookup마다 SQL의JOIN을 실행하여 테이블의 일부를 가져오고, select .. from에서 관련된 필드들을 가져온다.

parameter에는 참조하는 class의 이름을 소문자로 쓰고 ' '에 감싼다. 여러개의 parameter를 가질 수 있다.
예) Store.objects.filter(id=1).select_related('gungu','city').values('id','name','city_name')

prefetch_related는 selected_related와 같이 data를 Cache에 저장하며, 모든 relationships에서 사용이 가능하다.
Selected_related는 하나의 Query로 related Objects들을 불러오지만, Prefetch_related는 main query가 실행이 된 후 별도의 query가 실행이 된다. 따라서 1번 이상 쿼리가 진행되기 때문에 가급적 selected_related를 사용하는 것이 리소스 소모를 줄일 수 있다,

구하려는 객체가 정참조 multiple objects(many-to-many or one-to-many)이거나, 또는 역참조 Foreign Key일때 사용한다.selected_related와 달리, prefetch_related는 SQL의 JOIN을 실행하지 않고, python에서 joining을 실행한다.

prefetch_related 은 원래의 main query가 실행된 후 별도의 query를 따로 실행하게 된다. 반면, select_related 은 하나의 query만으로 related objects들을 다 가져온다.
즉, 완벽히 동일한 결과라도 prefetch_related 를 쓰느냐, select_related 를 쓰느냐에 따라 query의 수가 달라진다.

 

ForeignKey와 정참조와 역참조

FK를 가진 클래스에서 가지지 않는 클래스를 참조할 때는 정참조

FK를 가지지 않은 클래스에서 가진 클래스를 참조할 때는 역참조

ForeignKey를 가진 child는 lookup(__)을 사용하여, parent의 필드를 참조할 수 있다.

parent도 같은 방법으로 자신의 child의 필드를 참조할 수 있다.

'First step > web depeloper step1' 카테고리의 다른 글

Unit Test  (0) 2021.12.15
select, prefetch related  (0) 2021.12.08
RESTful API  (0) 2021.12.03
csv파일로 database에 입력하기  (0) 2021.12.02
관계형 데이터 모델링  (0) 2021.11.28