2012-06-04 19 views
9

Xin hãy giúp tôi hiểu điều này:App Engine của UnindexedProperty chứa lạ đang

On v1.6.6 nó trong dòng 2744 của google/appengine/ext/db/__init__.py:

class UnindexedProperty(Property): 
    """A property that isn't indexed by either built-in or composite indices. 

    TextProperty and BlobProperty derive from this class. 
    """ 
    def __init__(self, *args, **kwds): 
    """Construct property. See the Property class for details. 

    Raises: 
     ConfigurationError if indexed=True. 
    """ 
    self._require_parameter(kwds, 'indexed', False) 



    kwds['indexed'] = True 
    super(UnindexedProperty, self).__init__(*args, **kwds) 
. 
. 
. 

Sau khi họ bị hạn chế tham số chỉ mục là False - Họ thiết lập nó thành True!

+0

@kamens cảm ơn cho tiền thưởng. +500, Câu hỏi này có thể thực sự làm phiền bạn :) – theosp

+0

Tôi không thể nhận tín dụng, @alpert cung cấp tiền thưởng ... – kamens

Trả lời

4

Trước 1.2.2, bạn có thể thực hiện truy vấn bộ lọc cho bất kỳ loại thuộc tính nào, ngay cả Văn bản và Blob. Họ chỉ trả lại các danh sách trống, nhưng nó hoạt động. Phiên bản 1.2.2 đã giới thiệu thuộc tính indexed cho các thuộc tính cho phép bạn tắt tính năng lập chỉ mục các thuộc tính đã chọn [1]. Kể từ đó, thuộc tính bạn muốn truy vấn phải được lập chỉ mục hoặc nó sẽ ném một ngoại lệ.

Chúng tôi biết rằng các thuộc tính Văn bản và Blob không thể lập chỉ mục được. Không thay đổi bất cứ điều gì khác, các truy vấn trên các thuộc tính đó sẽ được nâng cao ngoại lệ từ 1.2.2 trên (mà họ đã không trước đó). Để không giới thiệu hồi quy và phá vỡ các ứng dụng hiện có, dòng kwds['indexed'] = True đã được thêm vào lớp UnindexedProperty.

Nếu chúng tôi có quyền kiểm soát tất cả mã tùy thuộc, đó sẽ là giải pháp sạch hơn để bắt đầu tăng ngoại lệ. Nhưng trong ánh sáng không phá vỡ các ứng dụng hiện có, nó đã được quyết định để vá nó.

Bạn có thể thử nó cho mình bằng cách thay đổi kwds['indexed'] = True-kwds['indexed'] = False và chạy đoạn mã này:

from google.appengine.ext import db 

class TestModel(db.Model): 
    text = db.TextProperty() 

TestModel(text='foo').put() 
print TestModel.all().filter('text =', 'foo').fetch(10) 

[1] http://code.google.com/p/googleappengine/source/browse/trunk/python/RELEASE_NOTES#1165

+0

Làm cho tinh thần, thú vị – kamens

+0

Vì vậy, UnindexedProperty chỉ cần thực thi mã không được đặt 'indexed = True 'nhưng sẽ xây dựng một chỉ mục trên một thuộc tính (không phải văn bản/Blob)? –

+0

(Một ví dụ phù hợp với mô tả của alpert @ sẽ là ArrayProperty in acocoon: https://github.com/Arachnid/aetycoon/blob/master/__init__.py) – kamens

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