SQL을 이미 알고 있는 경우 Django ORM
이 게시물에서는 동등한 SQL 문에 대한 유추를 통해 Django ORM을 사용하는 방법을 설명합니다. 새로운 주제를 기존 지식에 연결하면 ORM 사용법을 더 빨리 배울 수 있습니다.
이름, 나이, 성별 속성이 있는 사람에 대한 간단한 기본 모델을 고려해 보겠습니다.
위의 엔터티를 구현하기 위해 SQL의 테이블로 모델링합니다.
CREATE TABLE Person (
id int,
name varchar(50),
age int NOT NULL,
gender varchar(10),
);
동일한 테이블이 기본 Model 클래스에서 상속되는 클래스로 Django에서 모델링됩니다. ORM은 후드 아래에 동등한 테이블을 생성합니다.
class Person(models.Model):
name = models.CharField(max_length=50, blank=True)
age = models.IntegerField()
gender = models.CharField(max_length=10, blank=True)
가장 많이 사용되는 데이터 유형은 다음과 같습니다.
SQL
장고
INT
IntegerField()
VARCHAR(n)
CharField(max_length=n)
TEXT
TextField()
FLOAT(n)
FloatField()
DATE
DateField()
TIME
TimeField()
DATETIME
DateTimeField()
사용할 수 있는 다양한 쿼리는 다음과 같습니다.
SELECT 문
모든 행 가져오기
SQL:
SELECT *
FROM Person;
장고:
persons = Person.objects.all()
for person in persons:
print(person.name)
print(person.gender)
print(person.age)
특정 열 가져오기
SQL:
SELECT name, age
FROM Person;
장고:
Person.objects.only('name', 'age')
개별 행 가져오기
SQL:
SELECT DISTINCT name, age
FROM Person;
장고:
Person.objects.values('name', 'age').distinct()
특정 행 수 가져오기
SQL:
SELECT *
FROM Person
LIMIT 10;
장고:
Person.objects.all()[:10]
LIMIT 및 OFFSET 키워드
SQL:
SELECT *
FROM Person
OFFSET 5
LIMIT 5;
장고:
Person.objects.all()[5:10]
WHERE 절
단일 열로 필터링
SQL:
SELECT *
FROM Person
WHERE id = 1;
장고:
Person.objects.filter(id=1)
비교 연산자로 필터링
SQL:
WHERE age > 18;
WHERE age >= 18;
WHERE age < 18;
WHERE age <= 18;
WHERE age != 18;
장고:
Person.objects.filter(age__gt=18)
Person.objects.filter(age__gte=18)
Person.objects.filter(age__lt=18)
Person.objects.filter(age__lte=18)
Person.objects.exclude(age=18)
BETWEEN 절
SQL:
SELECT *
FROM Person
WHERE age BETWEEN 10 AND 20;
장고:
Person.objects.filter(age__range=(10, 20))
LIKE 연산자
SQL:
WHERE name like '%A%';
WHERE name like binary '%A%';
WHERE name like 'A%';
WHERE name like binary 'A%';
WHERE name like '%A';
WHERE name like binary '%A';
장고:
Person.objects.filter(name__icontains='A')
Person.objects.filter(name__contains='A')
Person.objects.filter(name__istartswith='A')
Person.objects.filter(name__startswith='A')
Person.objects.filter(name__iendswith='A')
Person.objects.filter(name__endswith='A')
IN 연산자
SQL:
WHERE id in (1, 2);
장고:
Person.objects.filter(id__in=[1, 2])
AND, OR 및 NOT 연산자
SQL:
WHERE gender='male' AND age > 25;
장고:
Person.objects.filter(gender='male', age__gt=25)
SQL:
WHERE gender='male' OR age > 25;
장고:
from django.db.models import Q
Person.objects.filter(Q(gender='male') | Q(age__gt=25))
SQL:
WHERE NOT gender='male';
장고:
Person.objects.exclude(gender='male')
NULL 값
SQL:
WHERE age is NULL;
WHERE age is NOT NULL;
장고:
Person.objects.filter(age__isnull=True)
Person.objects.filter(age__isnull=False)
# Alternate approach
Person.objects.filter(age=None)
Person.objects.exclude(age=None)
키워드로 주문
오름차순
SQL:
SELECT *
FROM Person
order by age;
장고:
Person.objects.order_by('age')
내림차순
SQL:
SELECT *
FROM Person
ORDER BY age DESC;
장고:
Person.objects.order_by('-age')
INSERT INTO 문
SQL:
INSERT INTO Person
VALUES ('Jack', '23', 'male');
장고:
Person.objects.create(name='jack', age=23, gender='male)
업데이트 문
단일 행 업데이트
SQL:
UPDATE Person
SET age = 20
WHERE id = 1;
장고:
person = Person.objects.get(id=1)
person.age = 20
person.save()
여러 행 업데이트
SQL:
UPDATE Person
SET age = age * 1.5;
장고:
from django.db.models import F
Person.objects.update(age=F('age')*1.5)
DELETE 문
모든 행 삭제
SQL:
DELETE FROM Person;
장고:
Person.objects.all().delete()
특정 행 삭제
SQL:
DELETE FROM Person
WHERE age < 10;
장고:
Person.objects.filter(age__lt=10).delete()
집합
MIN 함수
SQL:
SELECT MIN(age)
FROM Person;
장고:
>>> from django.db.models import Min
>>> Person.objects.all().aggregate(Min('age'))
{'age__min': 0}
MAX 기능
SQL:
SELECT MAX(age)
FROM Person;
장고:
>>> from django.db.models import Max
>>> Person.objects.all().aggregate(Max('age'))
{'age__max': 100}
AVG 함수
SQL:
SELECT AVG(age)
FROM Person;
장고:
>>> from django.db.models import Avg
>>> Person.objects.all().aggregate(Avg('age'))
{'age__avg': 50}
SUM 함수
SQL:
SELECT SUM(age)
FROM Person;
장고:
>>> from django.db.models import Sum
>>> Person.objects.all().aggregate(Sum('age'))
{'age__sum': 5050}
COUNT 함수
SQL:
SELECT COUNT(*)
FROM Person;
장고:
Person.objects.count()
GROUP BY 문
성별에 따른 사람 수
SQL:
SELECT gender, COUNT(*) as count
FROM Person
GROUP BY gender;
장고:
Person.objects.values('gender').annotate(count=Count('gender'))
HAVING 절
인원이 1명 이상인 경우 성별에 따른 인원 수
SQL:
SELECT gender, COUNT('gender') as count
FROM Person
GROUP BY gender
HAVING count > 1;
장고:
Person.objects.annotate(count=Count('gender'))
.values('gender', 'count')
.filter(count__gt=1)
조인
책과 출판사 간의 외래 키 관계를 고려하십시오.
class Publisher(models.Model):
name = models.CharField(max_length=100)
class Book(models.Model):
publisher = models.ForeignKey(Publisher, on_delete=models.CASCADE)
책의 출판사 이름 가져오기
SQL:
SELECT name
FROM Book
LEFT JOIN Publisher
ON Book.publisher_id = Publisher.id
WHERE Book.id=1;
장고:
book = Book.objects.select_related('publisher').get(id=1)
book.publisher.name
특정 발행인이 있는 책 가져오기
SQL:
SELECT *
FROM Book
WHERE Book.publisher_id = 1;
장고:
publisher = Publisher.objects.prefetch_related('book_set').get(id=1)
books = publisher.book_set.all()
연결하다
이 블로그 게시물이 마음에 드셨다면 매주 새 블로그 게시물을 공유하는 곳에서 저와 연락해 주시기 바랍니다.
Reference
이 문제에 관하여(SQL을 이미 알고 있는 경우 Django ORM), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/amitness/django-orm-if-you-already-know-sql-k80텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)