sqlalchemy는 NULL이 아닙니다.


104

특정 열에서 NULL이 아닌 값을 선택하기 위해 SQL에서와 같이 필터를 추가하려면 어떻게해야합니까?

SELECT * 
FROM table 
WHERE YourColumn IS NOT NULL;

SQLAlchemy 필터로 어떻게 똑같이 할 수 있습니까?

select = select(table).select_from(table).where(all_filters) 

여기는 무엇입니까 all_filters? 왜 select_from?
Martijn Pieters

테이블 정의가 있거나 열 리터럴을 사용해야합니까?
Martijn Pieters

답변:


137

column_obj != NoneIS NOT NULL제약 조건 을 생성합니다 .

열 컨텍스트에서 절을 생성합니다 a != b. 대상이 None이면 IS NOT NULL.

또는 사용 isnot()(0.7.9의 새로운 기능) :

IS NOT운영자를 구현하십시오 .

일반적으로 로 해석되는 IS NOT의 값과 비교할 때 자동으로 생성됩니다 . 그러나 특정 플랫폼에서 부울 값과 비교할 경우 명시 적으로 사용하는 것이 바람직 할 수 있습니다.NoneNULLIS NOT

데모:

>>> from sqlalchemy.sql import column
>>> column('YourColumn') != None
<sqlalchemy.sql.elements.BinaryExpression object at 0x10c8d8b90>
>>> str(column('YourColumn') != None)
'"YourColumn" IS NOT NULL'
>>> column('YourColumn').isnot(None)
<sqlalchemy.sql.elements.BinaryExpression object at 0x104603850>
>>> str(column('YourColumn').isnot(None))
'"YourColumn" IS NOT NULL'

8
"is not None"이 동일한 출력을 생성합니까?
Breezer

21
@Breezer : 아니요, is사용자 지정 클래스에 의해 오버로드 될 수 없기 때문 !=입니다.
Martijn Pieters

3
다른 대답은 지금 선호하는 대답입니다. 또한 PyCharm을 포함한 많은 IDE가 경고를 생성하는 것을 방지합니다.
안티 Haapala

@AnttiHaapala : '선호'인지 잘 모르겠습니다. SQLAlchemy 문서는 더 중요한 사용 사례로 부울을 인용합니다. 이 옵션을 추가했습니다.
Martijn Pieters

99

0.7.9 버전부터는 다음 .isnot과 같이 제약 조건을 비교하는 대신 필터 연산자 를 사용할 수 있습니다 .

query.filter(User.name.isnot(None))

이 방법은 pep8이 우려되는 경우에만 필요합니다.

출처 : sqlalchemy 문서


5
pep8을 행복하게 만드는 것 외에도 SQL NULL의 RHS만큼 유효하지 않고 더 나은 !=사용으로 isnot생성 된 명령문의 모양에 대한 의도를 전달하기 때문에 이것이 더 나은 솔루션이라고 생각합니다 .
Josh

2
@Josh : SQLAlchemy는 Python 쪽에서 != NULL사용하더라도 내 보내지 않습니다 column != None. 당신은 얻는다 IS NOT NULL. 그러나을 사용 .isnot()하면 다른 유형에 강제로 적용 할 수 있습니다 IS NOT( .isnot(True)예 : 부울 열에 대해 생각해보십시오 ).
Martijn Pieters

43

다른 사람이 궁금한 경우 다음 is_을 생성 하는 데 사용할 수 있습니다 foo IS NULL.

>>> sqlalchemy.sql 가져 오기 열에서
>>> print column ( 'foo'). is_ (None)
foo는 NULL입니다.
>>> print column ( 'foo'). isnot (None)
foo는 NULL이 아닙니다.

1
고마워요. 제가 찾고 있던 것이지만 Google이 저를 여기로 보냈습니다!
Sinister Beard
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.