2013-09-25 35 views
28

Tôi có một trường boolean trong bảng db mysql.flake8 than phiền về so sánh boolean "==" trong mệnh đề bộ lọc

# table model 
class TestCase(Base): 
    __tablename__ = 'test_cases' 
    ... 
    obsoleted = Column('obsoleted', Boolean) 

Để lấy số liệu của tất cả các trường hợp thử nghiệm phi lỗi thời, mà có thể được thực hiện đơn giản như thế này:

caseNum = session.query(TestCase).filter(TestCase.obsoleted == False).count() 
print(caseNum) 

đó làm việc tốt, nhưng flake8 báo cáo cảnh báo sau đây:

E712: So sánh với False phải là "nếu cond là False:" hoặc "if not cond:"

Được rồi, tôi nghĩ rằng có ý nghĩa. Vì vậy, thay đổi mã của tôi như thế này:

caseNum = session.query(TestCase).filter(TestCase.obsoleted is False).count() 

hoặc

caseNum = session.query(TestCase).filter(not TestCase.obsoleted).count() 

Nhưng không ai trong số họ có thể làm việc. Kết quả luôn là 0. Tôi nghĩ rằng mệnh đề bộ lọc không hỗ trợ toán tử "is" hoặc "is not". Liệu ai đó có thể cho tôi biết cách xử lý tình huống này không. Tôi không muốn vô hiệu hóa flake.

+0

[PEP 8] (http://www.python.org/dev/peps/pep-0008/#programming-recommendations) đặc biệt khuyên * chống lại * "nếu cond là False". Tôi ngạc nhiên khi [pep8 tool] (http://pep8.readthedocs.org/en/latest/intro.html) làm ngược lại. –

Trả lời

46

Đó là bởi vì bộ lọc SQLAlchemy là một trong số ít những nơi mà == False thực sự có ý nghĩa. Mọi nơi khác bạn nên không sử dụng số.

Thêm # noqa nhận xét dòng và được thực hiện với nó.

Hoặc bạn có thể sử dụng sqlalchemy.sql.expression.false:

from sqlalchemy.sql.expression import false 

TestCase.obsoleted == false() 

nơi false() trả về giá trị phù hợp với phương ngữ phiên SQL của bạn. Có một số sqlalchemy.expression.true phù hợp.

20

Thuật giả kim thuật SQL cũng có các chức năng is_isnot bạn có thể sử dụng. Một ví dụ sẽ

Model.filter(Model.deleted.is_(False)) 

More on those here

+1

Trong Python 'is' và' == 'là khác nhau nhưng tôi khá chắc chắn SQL được tạo ra ở đây sẽ giống nhau. – avoliva

+1

'is' và' == 'khác nhau trong SQLAlchemy vì bạn không thể ghi đè toán tử nhận dạng (' is') trong python. Một biểu thức như 'Model.column là False' luôn được đánh giá là' False' bởi vì sự so sánh luôn xảy ra ngay lập tức trong python và không phải là cơ sở dữ liệu. Kết quả so sánh danh tính của đối tượng cột và boolean luôn là 'False'. Điều này chèn các câu lệnh như 'WHERE FALSE' hoặc' AND FALSE' vào truy vấn của bạn, mà trong hầu hết các trường hợp sẽ làm cho nó trả về 0 hàng không có vấn đề gì. – Josh

0

@Jruv Sử dụng # noqa trước tuyên bố, nó sẽ bỏ qua các cảnh báo.

Các vấn đề liên quan