Django에서 원시 쿼리 조작

Salman Mehmood 2022년8월18일
Django에서 원시 쿼리 조작

이 설명을 통해 raw() 메서드가 하는 일과 원시 쿼리를 조작하는 방법에 대해 배우고 Django의 응용 프로그램에 SQL을 삽입하는 방법도 배웁니다.

Django의 raw() 메서드를 사용하여 원시 쿼리 조작

Django에서 raw() 메서드를 사용하면 SQL 쿼리를 가져오거나 빌드하고 실행할 수 있습니다. 그러나 이것이 Django에서 SQL 쿼리를 실행하는 유일한 방법은 아닙니다. 기본 양식 설정을 사용하는 대신 원하는 경우 양식을 무시하고 SQL 쿼리를 실행할 수도 있습니다.

그러나 우리는 왜 그것을 언급했습니까? 원시 SQL 쿼리를 실행할 때 일반적으로 모델 관리자 raw() 메서드가 첫 번째 옵션이어야 하기 때문입니다.

원시 쿼리 세트 클래스 인스턴스의 구조가 쿼리 세트 클래스 인스턴스로 작업한 것과 매우 유사하기 때문입니다. 인덱싱 및 슬라이싱과 같은 원시 쿼리에서 다른 작업을 수행할 수 있습니다.

그럼 정말 간단한 예부터 시작하겠습니다. 계속해서 STUDENT_DATA()라는 새 함수를 생성해 보겠습니다.

models.py 파일의 Student 모델과 간단한 데이터 세트를 사용합니다.

class Student(models.Model):

    FIRST_NAME = models.CharField(max_length=100)
    SR_NAME = models.CharField(max_length=100)
    age = models.IntegerField()
    CLASS_ROOM = models.IntegerField()
    TEACHER = models.CharField(max_length=100)

    def __str__(self):
        return self.FIRST_NAME

이제 view.py 파일로 돌아가서 STUDENT_DATA()라는 함수를 만들어 원시 SQL을 시연해 보겠습니다.

함수 내에서 Student.object.all()을 사용하여 Student 테이블의 모든 데이터를 가져옵니다. 그러면 이 테이블의 모든 학생 데이터가 반환되고 SD_DATA에 저장됩니다.

이 개체를 인쇄해 보겠습니다. 또한 SQL의 출력과 일부 성능 측정값을 제공하는 connection.queries도 사용할 것입니다.

def STUDENT_DATA(request):

    SD_DATA = Student.objects.all()

    print(SD_DATA)
    print(connection.queries)
    return render(request, "output.html", {"data": SD_DATA})

서버를 실행해 보겠습니다. 브라우저에 모든 데이터가 표시되고 아래에서 실행한 SQL 쿼리를 볼 수 있습니다.

Django 원시 SQL 출력 1

계속해서 raw() 메서드를 사용하여 동등한 것을 만들어 보겠습니다. 따라서 다시 student와 그 객체를 사용하지만 이번에는 raw()를 사용합니다.

이 메서드에서 SELECT * FROM student_student SQL 쿼리를 실행해야 합니다.

이러한 개별 항목을 모두 선택할 필요는 없으므로 별표를 사용하여 모든 테이블 필드를 선택할 수 있으며 다음 절은 테이블을 찾는 데 도움이 되는 FROM입니다. 그런 다음 student_student라는 테이블 이름을 정의합니다.

SD_DATA = Student.objects.raw("SELECT * FROM student_student")

브라우저로 돌아가서 새로 고침해 보겠습니다. 그런 다음 Select 문을 사용하여 데이터베이스에서 이러한 항목을 반환하는 것을 볼 수 있습니다.

Django 원시 SQL 출력 2

이제 우리는 앞으로 나아가 이것을 약간 확장하고 개별 항목을 선택할 것입니다. 이렇게 하려면 WHERE 절을 사용해야 합니다. 공백 하나 뒤에 age 속성을 선택하고 21 값으로 전달합니다.

SD_DATA = Student.objects.raw("SELECT * FROM student_student WHERE age=21")

Django 서버를 다시 실행하고 브라우저를 새로 고쳐봅시다. 그런 다음 SQL이 작동하고 데이터베이스에서 단일 항목을 반환하는 것을 볼 수 있습니다.

Django 원시 SQL 출력 3

우리는 SQL을 Django의 raw() 함수에 삽입하는 방법과 데이터베이스에서 작업을 수행하는 방법을 보았습니다.

Django 문서에서 Model 인스턴트 참조를 살펴보고 자세히 읽으면 지연된 모델에 대한 정보를 얻을 수 있습니다. 지연된 모델 인스턴스라는 용어는 요청 시 로드할 때까지 쿼리에서 내보낸 필드를 의미합니다.

데이터를 인쇄하려면 출력에서 ​​보고 싶은 데이터를 지정해야 하므로 for 루프를 사용해야 합니다.

for d in Student.objects.raw("SELECT * FROM student_student"):
    print(d)

우리가 이것을 다시 실행한다면, 우리는 이것을 출력하고 테이블에서 세 개의 이름을 반환하기 때문에 콘솔을 살펴보십시오.

Django 원시 SQL 출력 4

더 복잡한 쿼리는 여기에서 찾을 수 있습니다. 예를 들어 쿼리 집합 만들기라는 개념은 반환하려는 개체의 수를 제한할 수 있음을 의미합니다.

이제 sql이라는 새 변수를 선언한 다음 여기에 SQL 쿼리를 저장하고 raw() 함수 내부에 전달합니다. raw() 함수 다음에 객체를 슬라이싱하여 두 개의 행을 제한합니다.

sql = "SELECT * FROM student_student"
SD_DATA = Student.objects.raw(sql)[:2]

출력을 보면 두 행만 반환됩니다.

Django 원시 SQL 출력 5

view.py 파일의 전체 소스 코드:

from django.shortcuts import render
from .models import Student
from django.db import connection


def STUDENT_DATA(request):

    SD_DATA = Student.objects.all()
    sql = "SELECT * FROM student_student"
    SD_DATA = Student.objects.raw(sql)[:2]
    # for d in Student.objects.raw('SELECT * FROM student_student'):
    #     print(d)

    print(SD_DATA)
    # print(connection.queries)
    return render(request, "output.html", {"data": SD_DATA})

템플릿 내에서 다음 코드를 사용했습니다.

{{data}}

<hr/>

{% for i in data %}
    <div>{{ i.FIRST_NAME }} - {{ i.age }}</div>
{% endfor %}
Salman Mehmood avatar Salman Mehmood avatar

Hello! I am Salman Bin Mehmood(Baum), a software developer and I help organizations, address complex problems. My expertise lies within back-end, data science and machine learning. I am a lifelong learner, currently working on metaverse, and enrolled in a course building an AI application with python. I love solving problems and developing bug-free software for people. I write content related to python and hot Technologies.

LinkedIn

관련 문장 - Django SQL