본문 바로가기

web/Django

raw query + group by 그리고 다른 디비에 접속

django 사용 중 3단 콤보로 맞아서 글로 남김

 

1. raw query + group by 에러

1
2
3
raw_query = "select date, sum('price') from test_table group by date"
 
Model.objects.raw(raw_query)
cs

 

실행시 만일 에러가 아래와 같다면

Raw query must include the primary key

django에서는 Model.objects.raw() 실행은 ORM 요청이기 때문에 raw 쿼리 요청 시에도 primay key를 요구하는데,

문제는 group by 문구가 들어가면

select 1 id, sum('price') from test_table group by date

 

"1 id" 같은 꼼수도 동작하지 않는다.

django.db를 통해 직접 커넥션을 맺어서 해결해야 한다.

1
2
3
4
5
6
7
from django.db import connection
 
raw_query = "select date, sum('price') from test_table group by date"
 
with connection.cursor() as cursor:
    cursor.execute(raw_query)
    row = cursor.fetchone()
cs

 

 

 

2. default 디비가 아닌 다른 디비로의 raw 쿼리

저의 경우 하나의 django에 4개의 디비를 바라보고 있다

 

from django.db import connection

 

connection 는 settings.py의 default를 바라보도록 설정되어 있다.

제가 원하는 디비에 커넥션을 맺기 위해서는

아래와 같이 셋팅해 주면 됩니다.

1
2
3
4
5
6
7
from django.db import connection, connections
from django.db.utils import OperationalError
 
db_conn = connections['settings.py의 원하는 디비']
with db_conn.cursor() as cursor:
    cursor.execute(raw_query)
    qs = cursor.fetchall()
cs

 

결론 : 문서를 꼼꼼히 읽자

 

 

참고 사항

https://docs.djangoproject.com/en/3.2/topics/db/sql/