[22.08.25] ORM2
ORM2
#sql #sqlite #django #객체지향
1.QuerySet API
※ 파이썬 메서드 호출 시
add( 1, 2 ) , add( a=1, b=2 ), add( 1, b=2 ) 처렴 가능했다.
비슷한 개념으로 id__gt=4 형태로 사용한다. 부등호 사용 못하는 이유.
-
gt (greater than) 초과
Entry.objects.filter(id__gt=4) # python orm
SELECT ... WHERE id > 4; # sql
-
gte (greater than equal) 이상
Entry.objects.filter(id__gte=4) # python orm
SELECT ... WHERE id >= 4; # sql
-
lt, lte
Entry.objects.filter(id__lt=4) # python orm Entry.objects.filter(id__lte=4)
SELECT ... WHERE id < 4; # sql SELECT ... WHERE id <= 4;
-
in
Entry.objects.filter(id__in=[1, 3, 4]) Entry.objects.filter(headline__in='abc')
SELECT ... WHERE id IN (1, 3, 4); SELECT ... WHERE headline IN ('a', 'b', 'c');
-
startswith
Entry.objects.filter(headline__startswith='Lennon')
SELECT ... WHERE headline LIKE 'Lennon%';
-
istartswith
Entry.objects.filter(headline__istartswith='Lennon')
SELECT ... WHERE headline ILIKE 'Lennon%';
insensitive => 대소문자 구분 없이
-
endswith
Entry.objects.filter(headline__endswith='Lennon') Entry.objects.filter(headline__iendswith='Lennon')
SELECT ... WHERE headline LIKE '%Lennon'; SELECT ... WHERE headline ILIKE '%Lennon';
-
contains
Entry.objects.get(headline__contains='Lennon’) Entry.objects.get(headline__icontains='Lennon’)
SELECT ... WHERE headline LIKE '%Lennon%’; SELECT ... WHERE headline ILIKE '%Lennon%';
-
range
import datetime start_date = datetime.date(2005, 1, 1) end_date = datetime.date(2005, 3, 31) Entry.objects.filter(pub_date__range=(start_date, end_date))
SELECT ... WHERE pub_date BETWEEN '2005-01-01' and '2005-03-31';
-
복합 활용
inner_qs = Blog.objects.filter(name__contains='Cheddar') entries = Entry.objects.filter(blog__in=inner_qs)
SELECT ... WHERE blog.id IN (SELECT id FROM ... WHERE NAME LIKE '%Cheddar%’);
-
활용
Entry.objects.all()[0]
SELECT ... LIMIT 1;
Entry.objects.order_by('id')
SELECT ... ORDER BY id;
Entry.objects.order_by(‘-id')
SELECT ... ORDER BY id DESC;
-
.query
ORM에서 어떻게 쿼리문을 작성하는지 확인할 수 있다.
그런데 쿼리셋 말고 단일 객체에 적용하면 오류가 난다.
print(Genre.objects.all().query) # SELECT 'db_genre','id','db_genre','name' FROM 'db_genre'
에러나는 이유 : 개별 인스턴스에 .query를 사용하여서
2.ORM 확장( 1 : N )
-
모델링 (ORM)
class Genre(models.Model): name = models.CharField(max_length=30) class Artist(models.Model): name = models.CharField(max_length=30) debut = models.DateField() class Album(models.Model): name = models.CharField(max_length=30) genre = models.ForeignKey('Genre', on_delete=models.CASCADE) artist = models.ForeignKey('Artist', on_delete=models.CASCADE)
Class 안에는 genre 라고 적어주어야 데이터베이스에는 _id 가 붙어서 genre_id 가 된다.
Class 안에서 genre_id라고 붙이면 데이터베이스에는 genre_id_id가 되어 이상해진다.
- Foreign Key (왜래키)
- 키를 사용하여 부모 테이블의 유일한 값을 참조 (참조 무결성)
- Foreign Key (왜래키)