【问题标题】:Google App Engine NDB - Cursor on query working on local dev but not in productionGoogle App Engine NDB - 查询光标在本地开发中工作,但不在生产中
【发布时间】:2026-01-30 02:30:01
【问题描述】:

我有一个问题。我第一次使用设置为 Cursor() 的游标调用查询。我从查询中获取 50 个项目

qry = cls.query(cls.store == store_id, cls.user != exclude_user, cls.active == True, cls.offline == False).order(cls.user, cls._key, -cls.created)

我将该 qry 返回给调用类并运行以下提取

result, next_cursor, more = qry.fetch_page(pagination, start_cursor=cursor)

这没问题,然后我使用光标执行以下操作并根据文档将其传递回客户端:

client_params['next_page'] = next_cursor.urlsafe()

我已经记录了这个游标,以确保它在对服务器的返回调用中是相同的,它是

我是这样理解的:

cursor = Cursor(urlsafe=page)

但是,第二次尝试检索接下来的 50 个或更少的项目总是会导致以下错误:

BadRequestError: cursor position is outside the range of the original query

现在整个过程在本地开发机器上运行良好,但在生产中却不行

【问题讨论】:

  • 你能在这两种情况下都转储你的查询对象吗?为了使光标正常工作,其他参数应该完全相同
  • 查询在两种情况下完全相同。我会在五分钟后得到,我会把它转储并添加到问题中

标签: python google-app-engine app-engine-ndb


【解决方案1】:

我怀疑您的问题来自cls.user != exclude_user 查询参数。

来自Limitations of cursors(是的,我知道它在被取代的db 文档中,但我很确定它也适用于ndb - 同样的限制are present in java as well,它们很可能在数据存储方面,而不是在客户端库端):

  • 由于!=IN 运算符是通过多个查询实现的,因此使用它们的查询不支持游标。

要确认尝试删除该查询参数。

至于为什么它只发生在生产环境中——开发服务器仿真可能没有涵盖这些细节。

【讨论】:

  • 直接来自 Google 文档:一些 NDB 查询不支持查询游标,但您可以修复它们。如果查询使用 IN、OR 或 !=,则查询结果将不适用于游标,除非按键排序。如果应用程序没有按键排序结果并调用 fetch_page(),则会收到 BadArgumentError。如果 User.query(User.name.IN(['Joe', 'Jane'])).order(User.name).fetch_page(N) 收到错误,将其更改为 User.query(User.name.IN (['Joe', 'Jane'])).order(User.name, User.key).fetch_page(N)
  • 这对我来说意味着你可以使用游标,只要你按键排序,当然对于不等式运算符,你必须先按顺序列出......
  • 无论如何,我通过迭代查询集并手动过滤用户而不是查询...