🌈 프로그래밍/Django

[ django ] AWS lambda raw sql 에서 django raw sql로 TypeError: not enough arguments for format string 에러

반응형

 

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'

 

반응형