Developer/Posting

Django: ORM 쿼리셋 정렬 순서가 아무렇게나 나온다구요...? (feat. DB별 기본 정렬)

codingzipsa 2022. 8. 7. 21:53
반응형

이번주 막바지 프로젝트를 향해 달리시던 튜티분께서 질문을 하셨다.

 

"로컬 환경에서 Table.objects.all()을 통한 쿼리셋 도출 시 PK 순으로 잘 나와서 그대로 배포했는데 배포환경에서는 데이터가 정렬기준 없는 듯이 뒤죽박죽 나와요. 원인을 못찾겠습니다."

 

코드를 보여달라 말씀드렸고, 보니 특별히 ordering 관련된 내용이 없어서 해당내용을 코드로서 추가(order_by) 해준다면 기대한대로 모든 환경에서 작동할 것이라 가이드를 드렸으나 이 부분에 대해 정확한 원인을 파악해보고 싶어 문서를 뒤지기 시작해보았다.

 

우선 장고 공식 문서 내 ordering 관련된 내용이다.

(Django - Model Meta options - ordering)

하단 단락을 보면 순서가 명확히 정의되지 않았다면 결괏값은 데이터베이스에서 불분명한 순서로 나타날 것이다라는 내용이 있다.

그렇다면 장고, 즉, 튜티분들의 코드 상 순서가 정의되지 않았으니 데이터베이스가 PK순으로 정렬/비정렬을 이끌어 내는 요소가 아닐까? 라는 의심이 들기 시작했고 가서 사용했던 데이터베이스를 물어보았다. 의심했던 바와 같이 로컬에서는 SQLite, 배포는 Postgre를 사용했다는 답변을 들었고 해당 내용에 맞춰 공식 문서와 관련 내용을 서치하기 시작했다.

 

서치한 결론으로 SQLite는 기본단위로서 rowid(PK)로의 정렬을 지원하고 Postgre는 여타 RDBMS와 같이 불분명한 순서, 즉, 정렬이 되지 않은채로 리턴되는 것이 기본이라고 확인하였다. (다만, 스택오버플로우에서는 Postgre가 경험상 저장시간순으로 정렬해서 리턴해주고 있다라는 말이 있긴하다)

 

ref:

https://www.sqlite.org/queryplanner.html

https://www.postgresql.org/docs/current/sql-select.html

https://stackoverflow.com/questions/24238067/does-sqlite-guarantee-the-order-of-results-to-match-a-table

https://stackoverflow.com/questions/6585574/postgres-default-sort-by-id-worldship

 

내용을 체크하여 전달드렸고, 늦은 밤 예상치 못했던 궁금증은 생각보다 쉽게 해결되었다!

반응형