본문 바로가기

Life/Daily & Tips

[Tips] pymysql 내 포맷팅을 이용한 sql 쿼리 조회 오류(python/ProgrammingError 오류 해결 방법)

SMALL

안녕하세요! 데코입니다!

오늘은 파이썬에서 pymysql 내 포맷팅(Formatting)을 활용해서 SQL 쿼리를 작성하다 발생한 오류를 설명하고

이를 해결하는 방법을 포스팅하려고 합니다!

1. 오류 발생 배경 및 오류 메시지

제가 pymysql을 이용해 DB를 연동하고 sql쿼리로 데이터를 추출하는데 위와 같은 오류를 만났어요!

 

아래와 같이 어제와 오늘 날짜를 '%Y-%m-%d H:i:s' 형식으로 생성했습니다!

# 데이터 예시
yesterday = ‘2023-01-29 08:44:40’
today = ‘2023-01-30 08:44:40’

이후 포맷팅을 활용하여 SQL BETWEEN 문에 두 날짜를 넣도록 스트링 쿼리를 작성하였고

쿼리를 조회한 결과 아래와 같은 오류 메시지를 발견했습니다!

 

2. 오류가 발생한 쿼리

# 포스팅을 위해 쿼리를 간소화하였습니다!
sql_오류 = """
SELECT  *
  FROM  TABLE
 WHERE  DATE BETWEEN {0} AND {1}
 """.format(yesterday, today)

 

3. 오류를 해결한 쿼리

# 포스팅을 위해 쿼리를 간소화하였습니다!
sql_해결 = """
SELECT  *
  FROM  TABLE
 WHERE  DATE BETWEEN '{0}' AND '{1}'
 """.format(yesterday, today)

 

4. 오류 원인

Python에서 MemoryError 오류는 SQL 문법이 틀려서 발생한 오류입니다.

# 데이터 예시
yesterday = ‘2023-01-15 01:15:30’
today = ‘2023-01-16 01:15:30’

저는 yesterday 변수와 today 변수 모두 string 형이기 때문에

포맷팅 중괄호에 있는 {0}과 {1}에 각각 들어가는 값도 문자열도 들어가서 정상적으로 작동할 거라고 생각을 했었어요!

 

하지만 python에서 포맷팅의 하는 경우

단순히 해당 위치에 변수로 지정한 값만을 넣어주기만 해서

 

스트링 쿼리 내에서 문자로 나타내주기 위해서는 작은따옴표(' ')를 이용해 구분을 해줘야 합니다!

 

(좌) 오류 코드 , (우) 해결 코드 

차이가 보이시나요?

 

좌측에 있는 '오류 코드'와 우측에 있는 '해결 코드'의 출력 결과를 비교하면 왜 오류가 났는지 확인이 됩니다!

 

포맷팅을 한 결과 날짜 형식이 문자열로 따로 표현되지 않았기 때문에

 

오류 코드의 쿼리를 실행했을 때에는 

2023-01-28까지 읽고 공백 뒤에 있는 01:15:30부터는 인식하지 못해서 오류가 발생했습니다!

(~ syntax to use near '08:44:40 AND 2023-01-30 08:44:40 ~' 오류 메시지가 나타난 원인)


"ProgrammingError : "

해결 방법

  1. (쿼리 문법 오류) 쿼리 작성이 잘못되었으므로 쿼리를 올바르게 수정한다.
  2. 포맷팅(Formatting)에 이용되는 변수에 띄어쓰기가 존재한다면,
    작은따옴표를 "꼭" 이용하여 띄어쓰기를 포함한 변수 전체가 문자로 인식되게 한다.

이렇게 오늘은 ProgrammingError에 대하여 해결하는 방법을 설명해 보았습니다!

 

이번 포스팅은 python내 작성한 스트링 쿼리가 잘못되어서 발생한 오류로

ProgrammingError 에러라고 해서 모두 위와 같은 원인이 아니라고 생각해요!

혹시나 저와 같은 실수로 인해 제 포스팅을 방문하셨다면 빠르게 해결하시길 바랍니다!!

 

우리 모두 오류 없는 코딩 해보아요!

읽어주셔서 감사합니다! :)

LIST