SQL을 이미 알고 있는 경우 Django ORM

34163 단어 djangopython
다른 MVC 프레임워크에서 Django로 마이그레이션하는 경우 이미 SQL을 알고 있을 가능성이 있습니다.

이 게시물에서는 동등한 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
장고

INTIntegerField()VARCHAR(n)CharField(max_length=n)TEXTTextField()FLOAT(n)FloatField()DATEDateField()TIMETimeField()DATETIMEDateTimeField()

사용할 수 있는 다양한 쿼리는 다음과 같습니다.

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()


연결하다



이 블로그 게시물이 마음에 드셨다면 매주 새 블로그 게시물을 공유하는 곳에서 저와 연락해 주시기 바랍니다.

좋은 웹페이지 즐겨찾기