본문 바로가기
Python/Django

[Django] Database Api 살펴보기

by Lee David 2022. 8. 12.
반응형

Database에 쿼리를 해야하는 상황에 ORM 방식으로 원하는 모델까지 생성을 한 상태에서의 쿼리 방법을 알아보겠습니다.

class Person(models.Model):
    first_name = models.CharField(...)
    last_name = models.CharField(...)
    birth_date = models.DateField(...)

Person 이라는 ORM 모델 객체를 만들었을때 쿼리하는 방법입니다.

1. raw 함수 활용 하기
Person.objects.raw('SELECT id, first_name, last_name, birth_date FROM myapp_person')

raw 함수는 우리가 일반적으로 사용하는 sql문으로 Database 조회를 가능하게 해주는 함수입니다.

2. 직접 connection 객체 사용하기
from django.db import connection, connections
# connection은 default로 설정되어 있는 Database를 사용합니다.
# connections는 원하는 Database를 선택하여 사용할 수 있습니다. 
# ex) with connections['dev_db'].cursor as cursor:
def my_custom_sql(self):
    with connection.cursor() as cursor:
        cursor.execute("UPDATE bar SET foo = 1 WHERE baz = %s", [self.baz])
        cursor.execute("SELECT foo FROM bar WHERE baz = %s", [self.baz])
        row = cursor.fetchone()

    return row

connection 객체를 직접 호출하여 데이터 베이스에 접근하는 방식입니다.

connections를 사용하여 default가 아닌 settings.py에 등록된 다른 Database의 connection을 사용할 수 있습니다.

settings.py에 Database 여러개 등록하기

# 프로젝트의 settings.py DATABASES 설정 값에서 추가
DATABASES = {
    "default": {
        "ENGINE": "django.db.backends.postgresql",
        "NAME": "main_db",
        "USER": " .",
        "PASSWORD": " .",
        "HOST": " .",
        "PORT": " .",
    },
    "read_replica": {
        "ENGINE": "django.db.backends.postgresql",
        "NAME": "replica_db",
        "USER": " .",
        "PASSWORD": " .",
        "HOST": " .",
        "PORT": " .",
    },
}
3. objects의 함수 이용 하기
Person.objects.all() # 테이블의 모든 데이터를 조회합니다.
Person.objects.first() # 조회 내용중 상위에 1개의 값을 가져옵니다.
Person.objects.filter(조건문=조건값) # where 조건문에 사용됩니다.

# 조건문 예시
# Person__name__exact='Django'
# Relation이 있는 Person 테이블의 name에 해당하는 필드가 exact(같은 문자 찾기) 한 조건문입니다.

filter 함수에 조건문을 넣어 여러가지 쿼리를 쉽게 사용 가능합니다.

조건문 알아보기

  • __exact : 정확히 같은 값
  • __iexact : 대소문자 구분없이 같은 값
  • __contains : 포함하는 문자 찾기
  • __icontains : 대소문자 구분없이 포함하는 문자 찾기
  • __in : list, tuple, String 과 같은 배열에 포함하는 대상 찾기
  • __gt, __gte, __lt, __lte : >, >=, <, <=
  • __range : 범위에 해당하는 데이터를 조회합니다. (주로 날짜나 숫자 범위)
반응형