복붙노트

[PYTHON] SQLAlchemy : 'and` 및`or`를 사용하면 예기치 않은 결과가 발생합니다.

PYTHON

SQLAlchemy : 'and` 및`or`를 사용하면 예기치 않은 결과가 발생합니다.

SQLAlchemy를 통해 데이터베이스 "뉴스"를 만들었습니다.

class News(Base):
    __tablename__ = "news"
    id = Column(Integer, primary_key = True)
    title = Column(String)
    author = Column(String)
    url = Column(String)
    comments = Column(Integer)
    points = Column(Integer)
    label = Column(String)

나는 또한 문자열을 가져 와서 문자열의 3 가지 변형 중 하나, 즉 '좋음', '아마도'또는 '결코'중 하나를 반환하는 함수 f (제목)가 있습니다. 필터링 된 행을 가져 오려고합니다.

rows = s.query(News).filter(News.label == None and f(News.title)=='good').all()

그러나 프로그램이 실패하여이 오류가 발생합니다.

raise TypeError("Boolean value of this clause is not defined")

어떻게 해결할 수 있습니까?

해결법

  1. ==============================

    1.문제는 다음과 같습니다.

    문제는 다음과 같습니다.

    News.label == None and f(News.title) == 'good'
    #                  ^^^ here
    

    파이썬은 부 울린 연산의 동작을 오버라이드 할 수 없습니다. 파이썬 3에서는 __bool__을 사용하고 파이썬 2에서는 __nonzero__을 사용하여 어느 정도 영향을 미칠 수 있습니다.하지만 실제로는 객체의 진리 값을 정의하는 것입니다.

    해당 객체가 __bool__을 구현하지 않았고 오류가 발생했거나 구현이 발생하지 않은 경우 and 및 or의 단락 특성으로 인해 다소 이상한 오류가 발생했습니다.

    In [19]: (News.label == 'asdf') and True
    Out[19]: <sqlalchemy.sql.elements.BinaryExpression object at 0x7f62c416fa58>
    
    In [24]: (News.label == 'asdf') or True
    Out[24]: True
    

    때문에

    In [26]: bool(News.label == 'asdf')
    Out[26]: False
    

    이것은 머리카락이 잘못된 SQL 표현의 형태로 끌어 당길 수 있고 초래할 수 있습니다.

    In [28]: print(News.label == 'asdf' or News.author == 'NOT WHAT YOU EXPECTED')
    news.author = :author_1
    

    부울 SQL 표현식을 생성하려면 and_ (), or_ () 및 not_ () SQL 표현식 함수 또는 바이너리 &, | 및 ~ 연산자 오버로드를 사용하십시오.

    # Parentheses required due to operator precedence
    filter((News.label == None) & (f(News.title) == 'good'))
    

    또는

    filter(and_(News.label == None, f(News.title) == 'good'))
    

    Query.filter () 호출에 여러 기준을 전달하십시오.

    filter(News.label == None, f(News.title) == 'good')
    

    또는 filter () 호출을 여러 개 결합 할 수 있습니다.

    filter(News.label == None).filter(f(News.title) == 'good')
    
  2. from https://stackoverflow.com/questions/42681231/sqlalchemy-unexpected-results-when-using-and-and-or by cc-by-sa and MIT license