2012-03-02 17 views
5

Tôi vừa mới có cơ hội xem xét khung công tác web2py và mặc dù tôi có một số kinh nghiệm trước đó với Django và hơn thế nữa với Python đơn giản, tôi không thể hiểu được hệ thống truy vấn mà web2py sử dụng.Các biểu thức truy vấn web2py hoạt động như thế nào?

Hãy lấy ví dụ này từ web2py book

db = DAL('sqlite://storage.db') 
myquery = (db.mytable.myfield > 'A') 
myset = db(myquery) 
rows = myset.select() 
for row in rows: 
    print row.myfield 

In a SO comment web2py tác giả nói rằng (db.mytable.myfield > 'A') không đánh giá là True/False trực tiếp và nó thực sự đánh giá cho mỗi hàng tại thời điểm lựa chọn. Tôi hiểu đây là những gì cho phép các biểu thức này được sử dụng làm đối tượng truy vấn và thậm chí được kết hợp.

Tôi đã cố gắng tìm câu trả lời trực tuyến nhưng không thể, vì vậy đây là câu hỏi của tôi: Các biểu thức truy vấn đó không được đánh giá đúng/sai như thế nào? Tại sao giá trị của myquery là không, nói, True? Tính năng Python nào mà tôi có thể bị thiếu cho phép tính năng này hoạt động?

Trả lời

7

Những câu trả lời khác có nó, nhưng chỉ để cung cấp hơn một chút web2py cụ thể chi tiết:

db.mytable.myfield > 'A' 

db.mytable.myfield là một thể hiện của các web2py Dal Field lớp, mà thừa hưởng từ DAL Expression lớp. Lớp Expression bản thân quá tải một số nhà khai thác Python, như ==, <, >, vv Những nhà khai thác quá tải, khi áp dụng cho Expression (và do đó Field) các đối tượng trả về một thể hiện của lớp DAL Query chứ không phải là một đối tượng Python boolean tiêu chuẩn . Đây là số source code cho nhà điều hành > (__gt__).

Xem here để biết thêm về quá tải nhà điều hành bằng Python.

2

Bất kỳ toán tử nào được áp dụng cho các đối tượng tùy chỉnh (không có sẵn) dựa trên đánh giá của special methods. Nó được biết đến rộng rãi là operator overloading. Vì vậy, về cơ bản định nghĩa lớp lĩnh vực trông giống nhau:

class DBField(...): 
#... 

    def __gt__(self,value): 
     #building query object, based on value 
     return query