프로그래밍/Python

TypeError: Boolean value of this clause is not defined 해결하기

채윤아빠 2021. 4. 27. 22:36
728x90
반응형

문제점 및 증상

sqlalchemy + mysqlconnector 패키지를 이용하여 MariaDB를 연동하는 작업을 하던중에 갑작스럽게 다음과 같은 오류를 만나게 되었습니다.

  File "C:\Dev\Python\Python38\lib\site-packages\mysql\connector\cursor.py", line 532, in execute
    if not operation:
  File "C:\Dev\Python\Python38\lib\site-packages\sqlalchemy\sql\elements.py", line 594, in __bool__
    raise TypeError("Boolean value of this clause is not defined")
TypeError: Boolean value of this clause is not defined

실제 쿼리는 "INSERT INTO ..."를 하는 구문으로 되어 있었는데, HeidiSQL 등에서 해당 쿼리를 실행해 보면 정상적으로 잘 실행이 되나, 어떻게 수정을 하여도 파이썬에서는 위와 같은 오류가 발생하였습니다.

원인 분석

오전 내내 헤메이다가 오류가 발생한 소스를 직접 열어서 분석해 보았습니다.

elements.py 소스에서 오류가 발생한 부분은 다음과 같습니다.

    def __bool__(self):
        raise TypeError("Boolean value of this clause is not defined")

cursor.py 소스에서 오류가 발생한 부분은 다음과 같습니다.

        if not operation:
            return None

cursor.py 소스의 오류를 유발한 원인은 "cursor.execute(query)" 부분으로 정상적으로 실행이 되어야 하는데, 정상적으로 실행이 되지 않았습니다.

            query = f"""
        SELECT
            addr_no
            , addr_name
        FROM ADDR_LEVEL2
        WHERE 1 = 1
            AND parent_addr_no = {addr_no}
                """
            cursor.execute(query)
            connection.commit()

query 객체가 "not" 연산 (bool())을 지원하지 않아서 발생한 오류인데, 문자열인데 왜 안될까? 한참을 고민했습니다.

해결 방안

결과적으로 아주 어이 없는 실수 때문에 발생한 오류였습니다.

다른 곳의 소스를 복사하는 과정에서 import 구분에 다음 부분이 추가되어 있었습니다.

from sqlalchemy import text

위 구문이 추가 되어 있음으로 인하여, 일반 문자열이 text로 변경되면서 "TypeError: Boolean value of this clause is not defined" 오류가 발생한 것이었습니다.

위 import 구문을 제거하였더니, 모든 쿼리가 정상적으로 호출되었습니다.