반응형
AWS 정상 동작 쿼리문
SELECT
-- 생략
DATE_FORMAT(DATE_ADD(m.schedule, INTERVAL 9 HOUR), '%Y.%m.%d %H:%i') schedule,
-- 생략
FROM
Match
WHERE
-- 생략
AND DATE_FORMAT(DATE_ADD(m.schedule, INTERVAL 9 HOUR), '%T') between '08:00:00' and '11:00:00'
위의 쿼리의 의미
1. 데이터를 가져오는데 시간 값을 해당 포맷으로 지정하고 가져와!
2. 시간 데이터를 가져오는데 시간값만 가져오고, 해당 시간이 08시부터 11시 사이인 데이터만 가져와!
해당 쿼리를 서버쪽 @shared_task로 이전해야 했기에, 굳이 ORM으로 변경하지 않고 사용하던 쿼리를 사용한다면 쉽게 동일한 데이터를 가져오겠구나! 생각했음.
하지만, Django 서버에서 위의 쿼리를 아래와 같이 실행해보니..
query = "실행할 쿼리문"
Match.objects.raw(query)
아래와 같은 오류를 직면했다.
File "/Users/dev/dev-django/venv/lib/python3.9/site-packages/django/db/models/sql/query.py", line 119, in __str__
return self.sql % self.params_type(self.params)
TypeError: not enough arguments for format string
초반에는 mysql client에서 그리고 AWS lambda에서 정상 동작하는 쿼리인데..
왜 python server에서는 안 되지? 이유를 잘 몰랐었다.
근데 정상 동작한다고 여기서도 정상 동작할 것이라고는 생각한다면 큰 경기도 오산이다.
오류는 말 그대로 정말 format 관련한 문제였다.
C언어를 배웠을 때 %d, % s와 같이 값이 출력 타입을 지정해주는 자료형들이 존재한다.
바로 그 문제였던 것이다. 따라서 아래와 같이 쿼리문을 수정하였다.
SELECT
-- 생략
LEFT(DATE_ADD(m.schedule, INTERVAL 9 HOUR), 15) schedule,
WHERE
-- 생략
AND RIGHT(DATE_ADD(m.schedule, INTERVAL 9 HOUR), 15) BETWEEN '08:00:00.000000' AND '11:00:00.000000'
결국 문제는 문자열에 있던 쿼리문의 % d, % i를 사용한 DATE_FORMAT mysql의 함수가 문제였던 것이다.
위에서 사용한 함수는 LEFT와 RIGHT로 말 그대로 왼쪽 또는 오른쪽부터, 어떤 문자열을, 몇 번째까지 자를 것인지에 대한 함수이다.
결과를 살펴보면 다음과 같다!
원래 데이터는 mysql DB에 저장되어있는 값이다.
-- 원래 데이터
'2022-12-01 09:00:00.000000'
-- 윗줄 결과
'2022-12-01 09:00'
-- 아랫줄 결과
'08:00:00.000000'
반응형
'🌈 프로그래밍 > Django' 카테고리의 다른 글
[ Django ] select_related()와 prefetch_related() (0) | 2023.02.20 |
---|---|
Django Session Cookie Age 알아보고 커스텀하기 (0) | 2023.02.20 |
[ Django ORM ] 문자열 숫자를 int로 캐스팅해서 정렬해보자. (0) | 2022.11.24 |
[ Django ] SerializerMethodField를 이용한 시리얼라이저 커스텀하기 (0) | 2022.07.21 |
[ Django ] postgresql을 사용할 때 migration 관련 오류 (0) | 2022.04.24 |