Ruff E712와 SQLAlchemy Boolean 조건식 처리하기

2026. 5. 20. 11:26·Language/Python

문제 상황

SQLAlchemy를 사용해 상품 목록을 조회하는 조건식을 작성하던 중, Ruff에서 다음과 같은 경고가 발생했습니다.

services\product-service\app\routes\products.py:94:27: E712 Avoid equality comparisons to `True`; use `if Product.is_active:` for truth checks

문제가 된 코드는 다음과 같습니다.

conditions.append(Product.is_active == True)

Ruff의 E712 규칙은 Python 코드에서 True, False와 직접 비교하는 패턴을 피하라는 경고입니다.

일반적인 Python 코드에서는 다음과 같은 비교를 권장하지 않습니다.

if value == True:
    ...

대신 아래처럼 truthy/falsy 평가를 사용하는 것이 더 자연스럽습니다.

if value:
    ...

일반 Python 코드에서 문제가 되는 이유

Python에서는 Boolean 값을 직접 == True, == False로 비교하지 않아도 조건문에서 참/거짓을 평가할 수 있습니다.

예를 들어 다음과 같은 코드는 불필요한 비교로 볼 수 있습니다.

if is_active == True:
    ...

보통은 다음과 같이 작성하는 것이 더 Pythonic합니다.

if is_active:
    ...

따라서 Ruff는 == True 같은 표현을 발견하면 E712 경고를 발생시킵니다.

SQLAlchemy에서는 상황이 다르다

하지만 SQLAlchemy의 where 조건식에서는 일반적인 Python Boolean 비교와 의미가 다릅니다.

conditions.append(Product.is_active == True)

위 코드는 Python의 Boolean 값을 단순 비교하는 코드가 아니라, SQLAlchemy가 SQL 조건식을 만들기 위한 표현식입니다.

즉, 의도는 다음과 같은 SQL 조건을 만드는 것입니다.

WHERE product.is_active = true

따라서 일반 Python 코드 기준으로는 E712 경고 대상이지만, SQLAlchemy 표현식에서는 의도된 사용일 수 있습니다.

이런 경우 Ruff 입장에서는 SQLAlchemy의 표현식 생성 의도를 정확히 구분하기 어렵기 때문에 오탐처럼 보일 수 있습니다.

해결 방법

SQLAlchemy에서는 Boolean 또는 NULL 비교를 위해 is_() 메서드를 사용할 수 있습니다.

변경 전 코드는 다음과 같습니다.

conditions.append(Product.is_active == True)

이를 아래와 같이 변경할 수 있습니다.

conditions.append(Product.is_active.is_(True))

이렇게 작성하면 Ruff의 E712 경고를 피하면서도, SQLAlchemy 표현식이라는 의도를 더 명확하게 드러낼 수 있습니다.

변경 전후 비교

변경 전

conditions.append(Product.is_active == True)

변경 후

conditions.append(Product.is_active.is_(True))

참고: None 비교도 같은 방식으로 처리 가능

SQLAlchemy 공식 문서에서도 None 비교에 대해 비슷한 예시를 제공합니다.

statement.where(users.c.name == None)

PEP8 또는 linter 경고가 신경 쓰이는 경우, 다음과 같이 is_()를 사용할 수 있습니다.

statement.where(users.c.name.is_(None))

Boolean 조건에서도 같은 방식으로 is_(True) 또는 is_(False)를 사용할 수 있습니다.

Product.is_active.is_(True)
Product.is_active.is_(False)

정리

Ruff의 E712는 일반 Python 코드에서 == True, == False 비교를 피하도록 안내하는 규칙입니다.

하지만 SQLAlchemy에서는 Product.is_active == True 같은 표현이 SQL 조건식을 만들기 위한 코드로 사용될 수 있습니다. 이 경우 일반적인 Python truth check와는 의미가 다르기 때문에 linter 경고가 오탐처럼 느껴질 수 있습니다.

이 문제는 SQLAlchemy의 is_() 메서드를 사용해 해결할 수 있습니다.

conditions.append(Product.is_active.is_(True))

결과적으로 linter 경고를 제거하면서도, SQLAlchemy 조건식의 의도를 더 명확하게 표현할 수 있었습니다.

Reference

  • SQLAlchemy 공식 문서: https://docs.sqlalchemy.org/en/14/core/tutorial.html

'Language > Python' 카테고리의 다른 글

FastAPI Depends()에서 Ruff B008 경고가 발생할 때 해결 방법  (0) 2026.05.20
Python 타입 힌트: Optional, Union, T | None 차이 정리  (0) 2026.05.20
'Language/Python' 카테고리의 다른 글
  • FastAPI Depends()에서 Ruff B008 경고가 발생할 때 해결 방법
  • Python 타입 힌트: Optional, Union, T | None 차이 정리
hwara_
hwara_
배움의 기쁨
  • hwara_
    기록 저장소
    hwara_
  • 전체
    오늘
    어제
    • 분류 전체보기 (24)
      • 일상 (1)
        • 회고 (1)
      • 프로젝트 (0)
      • OS (2)
        • Mac (0)
        • Linux (2)
      • 클라우드 (1)
        • AWS (0)
        • CloudFlare (1)
      • Devops (10)
        • Docker (1)
        • Kubernetes (7)
        • Terraform (0)
        • GitHub Actions (2)
      • 알고리즘 (0)
      • Git (2)
      • Database (1)
      • Language (3)
        • Python (3)
      • 환경구성 (4)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • GitHub
  • 공지사항

  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
hwara_
Ruff E712와 SQLAlchemy Boolean 조건식 처리하기
상단으로

티스토리툴바