sqlalchemy KHÔNG ĐỦ lựa chọn


104

Làm cách nào để thêm bộ lọc như trong SQL để chọn các giá trị KHÔNG ĐẦY ĐỦ từ một cột nhất định?

SELECT * 
FROM table 
WHERE YourColumn IS NOT NULL;

Làm cách nào để làm điều tương tự với bộ lọc SQLAlchemy?

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

Cái gì all_filtersở đây? Tại sao select_from?
Martijn Pieters

Và bạn có định nghĩa bảng hay bạn cần sử dụng các ký tự cột?
Martijn Pieters

Câu trả lời:


137

column_obj != Nonesẽ tạo ra một IS NOT NULLhạn chế :

Trong ngữ cảnh cột, tạo mệnh đề a != b. Nếu mục tiêu là None, sản xuất a IS NOT NULL.

hoặc sử dụng isnot()(mới trong 0.7.9):

Thực hiện các IS NOTnhà điều hành.

Thông thường, IS NOTđược tạo tự động khi so sánh với giá trị của None, giá trị này phân giải thành NULL. Tuy nhiên, việc sử dụng rõ ràng IS NOTcó thể được mong muốn nếu so sánh với các giá trị boolean trên một số nền tảng nhất định.

Bản giới thiệu:

>>> 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
"Không phải Không" có tạo ra cùng một sản lượng không?
Breezer

21
@Breezer: không, vì iskhông thể bị quá tải bởi các lớp tùy chỉnh theo cách !=có thể.
Martijn Pieters

3
Câu trả lời còn lại là câu trả lời ưa thích hiện nay; nó cũng tránh nhiều IDE bao gồm cả PyCharm tạo cảnh báo.
Antti Haapala

@AnttiHaapala: Tôi không chắc liệu nó có được 'ưu tiên' hay không. Tài liệu SQLAlchemy trích dẫn boolean là một usecase quan trọng hơn. Tôi đã thêm tùy chọn đó.
Martijn Pieters

99

Bắt đầu từ phiên bản 0.7.9, bạn có thể sử dụng toán tử bộ lọc .isnotthay vì so sánh các ràng buộc, như sau:

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

Phương pháp này chỉ cần thiết nếu pep8 là một mối quan tâm.

nguồn: tài liệu sqlalchemy


5
Ngoài việc làm cho pep8 hài lòng, tôi nghĩ đây là một giải pháp tốt hơn vì NULLnó không phải là giá trị hợp lệ như RHS của !=SQL và việc sử dụng sẽ isnottruyền đạt tốt hơn ý định của bạn cho những gì bạn muốn câu lệnh được tạo trông như thế nào.
Josh

2
@Josh: != NULLTuy nhiên, SQLAlchemy sẽ không phát ra , ngay cả khi bạn sử dụng column != Noneở phía Python; bạn nhận được IS NOT NULL. Tuy nhiên , việc sử dụng .isnot()cho phép bạn ép buộc IS NOT các kiểu khác ( .isnot(True)ví dụ: hãy nghĩ đến các cột boolean).
Martijn Pieters

43

Trong trường hợp bất kỳ ai khác thắc mắc, bạn có thể sử dụng is_để tạo foo IS NULL:

>>> từ cột nhập sqlalchemy.sql
>>> print column ('foo'). is_ (None)
foo LÀ KHÔNG ĐỦ
>>> print column ('foo'). isnot (Không có)
foo KHÔNG ĐỦ

1
Cảm ơn, đây là những gì tôi đang tìm kiếm nhưng Google đã gửi cho tôi ở đây!
Sinister Beard vào
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.