2012-09-16 29 views
8

Tôi không thể hiểu điều này có nghĩa là lỗi và rõ ràng, không ai nhận lỗi cùng trên internetBadArgumentError: _MultiQuery với con trỏ đòi hỏi trật tự __key__ trong NDB

BadArgumentError: _MultiQuery with cursors requires __key__ order

Điều này xảy ra ở đây:

return SocialNotification.query().order(-SocialNotification.date).filter(SocialNotification.source_key.IN(nodes_list)).fetch_page(10) 

Thuộc tính source_key rõ ràng là một khóa và nodes_list là danh sách các khóa thực thể được truy xuất trước đó.

Điều tôi cần là tìm tất cả các SocialNotifications có trường source_key khớp với một trong các phím trong danh sách.

+1

Tất cả những gì tôi đã tìm thấy cho điều này là nhận xét trong mã nguồn SDK phía trên câu lệnh tăng tính toán này: "Con trỏ chỉ được hỗ trợ cho các lệnh nhất định". Tôi đoán: nếu bạn đang sử dụng con trỏ, bạn phải thiết lập thứ tự theo khóa vì một số lý do, nhưng nó không có ý nghĩa với tôi .. –

+0

Tôi đang thực hiện gần như truy vấn chính xác này. Bạn có tìm cách giải quyết vấn đề hay thiết kế lại dữ liệu để làm việc xung quanh nó không? – Dylan

Trả lời

17

Thông báo lỗi cố gắng cho bạn biết rằng các truy vấn liên quan đến IN và con trỏ phải được đặt hàng bởi __key__ (là tên nội bộ cho khóa của pháp nhân). (Điều này là cần thiết để kết quả có thể được hợp nhất và tạo thành duy nhất.) Trong trường hợp này, bạn phải thay thế cuộc gọi .order() bằng .order(SocialNotification._key).

+0

Tôi biết bạn không còn hoạt động trên nhóm công cụ ứng dụng nữa. Nhưng thực hành tốt có sử dụng khóa riêng theo cách như vậy không? Nếu có, thì tại sao không công khai? – mohi666

+0

__key__ là tên trong kho dữ liệu, không phải bằng Python. Nó có dạng đặc biệt để tránh va chạm với các thuộc tính do người dùng định nghĩa. –

3

Dường như điều này cũng xảy ra khi bạn lọc sự bất bình đẳng và cố gắng tìm nạp một trang. Điều này về cơ bản có nghĩa là (trừ khi tôi bỏ lỡ một cái gì đó) mà bạn không thể fetch_page khi sử dụng một bộ lọc bất bình đẳng vì một mặt bạn cần loại là MyModel.prop nhưng mặt khác bạn cần nó là MyModel._key, cứng :)

3

tôi tìm thấy câu trả lời ở đây: https://developers.google.com/appengine/docs/python/ndb/queries#cursors

bạn có thể thay đổi truy vấn của bạn để:

SocialNotification.query().order(-SocialNotification.date, SocialNotification.key).filter(SocialNotification.source_key.IN(nodes_list)).fetch_page(10)

để có được điều này để làm việc. Lưu ý rằng nó có vẻ là chậm (18 giây) khi nodes_list là lớn (1000 thực thể), ít nhất là trên máy chủ phát triển. Tôi không có số lượng lớn dữ liệu thử nghiệm trên máy chủ thử nghiệm.

0

Tôi đã gặp lỗi tương tự khi lọc mà không có nhóm. Đã xảy ra lỗi mỗi lần bộ lọc của tôi trả về nhiều kết quả.

Để khắc phục, tôi thực sự phải thêm đặt hàng theo khóa.

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