Передача курсора на ndb в Google App Engine Python 3 приводит к ошибке - PullRequest
1 голос
/ 20 июня 2020

Примечание: Это происходит на моем сервере разработки (MA C работает Mojave)

Я использую Python 3 в Google App Engine (стандартная среда), и я есть код ниже

cursor = ndb.Cursor(urlsafe = next_page) if next_page else ndb.Cursor()
q = myObject.query(myObject.link == linkKey).order(-myObject.created)
resultsFuture = q.fetch_page_async(PAGE_SIZE,start_cursor=cursor)

Если next_page не None (что означает, что курсор не None), я получаю следующую ошибку:

Traceback (most recent call last):
  File .../env/lib/python3.7/site-packages/google/cloud/ndb/_datastore_api.py", line 92, in rpc_call
    result = yield rpc
grpc._channel._MultiThreadedRendezvous: <_MultiThreadedRendezvous of RPC that terminated with:
    status = StatusCode.INVALID_ARGUMENT
    details = "Error parsing protocol message"
    debug_error_string = "{"created":"<CREATION_TIME>","description":"Error received from peer ipv6:<MY_IP_ADDRESS>","file":"src/core/lib/surface/call.cc","file_line":1056,"grpc_message":"Error parsing protocol message","grpc_status":3}"
>

Кто-нибудь сталкивался с этим раньше, и если да, то что было решение?

Если нет, может ли кто-нибудь указать мне возможное решение?

1 Ответ

0 голосов
/ 25 июня 2020

https://github.com/googleapis/python-ndb/issues/471#issuecomment -649173225 говорит:

Привет, cursor, возвращаемый fetch_page_async, уже является экземпляром Cursor. Аргумент urlsafe для Cursor - это строка, которая может быть получена путем вызова Cursor.urlsafe() для экземпляра курсора. Поскольку cursor, возвращаемый fetch_page_async, уже является экземпляром Cursor, его можно передать напрямую другому вызову fetch_page_async.

Поэтому вместо этого вы должны сделать:

cursor = next_page if next_page else ndb.Cursor()
q = myObject.query(myObject.link == linkKey).order(-myObject.created)
resultsFuture = q.fetch_page_async(PAGE_SIZE,start_cursor=cursor)
...