[PYTHON] SQLAlchemy : 'and` 및`or`를 사용하면 예기치 않은 결과가 발생합니다.
PYTHONSQLAlchemy : '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.문제는 다음과 같습니다.
문제는 다음과 같습니다.
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')
from https://stackoverflow.com/questions/42681231/sqlalchemy-unexpected-results-when-using-and-and-or by cc-by-sa and MIT license
'PYTHON' 카테고리의 다른 글
[PYTHON] PyLint가 numpy 멤버를 인식하게하려면 어떻게해야합니까? (0) | 2018.11.01 |
---|---|
[PYTHON] 장고 양식 다중 선택 (0) | 2018.11.01 |
[PYTHON] numpy 배열을 PySide QPixmap으로 변환 (0) | 2018.11.01 |
[PYTHON] scapy에서 변경된 src / dst로 pcap에서 패킷 보내기 (0) | 2018.11.01 |
[PYTHON] SQLAlchemy를 Google Cloud SQL과 함께 사용할 수 있습니까? (0) | 2018.11.01 |