GAE python NDB 投影查询在开发中工作但不在生产中
GAE python NDB projection query working in development but not in production
我一直在用头撞墙,因为我的 Google App Engine python 项目有一个非常简单的 NDB 投影查询,它在我的本地机器上运行良好,但在部署时神秘地失败了生产。
更神秘...作为测试,我在另一个 属性 上添加了一个相同的投影,它在开发和生产中都有效!有人可以帮忙吗?以下是更多详情:
我有以下代表费用的实体:
class Entry(ndb.Model):
datetime = ndb.DateTimeProperty(indexed=True, required=True)
amount = ndb.IntegerProperty(indexed=False, required=True)
payee = ndb.StringProperty(indexed=True, required=True)
comment = ndb.StringProperty(indexed=False)
# ...
稍后在代码中我正在对 Entry.payee 进行投影(以获取所有收款人的列表)。作为测试,我还在 Entry.datetime:
上添加了一个投影
log_msg = '' # For passing debug info to the browser
payeeObjects = Entry.query(ancestor=exp_traq_key(exp_traq_name), projection=[Entry.payee]).fetch()
payees = []
for obj in payeeObjects:
payees.append(obj.payee)
log_msg += '%d payees: %s' % (len(payees), str(payees))
log_msg += ' ------------------- ' # a visual separator
dtObjects = Entry.query(ancestor=exp_traq_key(exp_traq_name), projection=[Entry.datetime]).fetch()
dts = []
for obj in dtObjects:
dts.append(obj.datetime)
log_msg += '%d datetimes: %s' % (len(dts), str(dts))
#...other code, including passing log_msg down to the client
这是开发环境中的输出(注意收款人列表和日期时间列表显示在控制台中):
这是部署到应用引擎时的输出。我无法将其发送到 return 收款人列表。它保持 returning 一个空列表,即使在开发中 returns 列表很好:
我已确保在 GAE 上正确设置了索引:
请帮忙!
2018-12-05更新:
我在生产中添加了更多条目,他们被选中了!见截图。但较旧的条目仍未 returned。
我的第一反应是数据存储索引需要以某种方式 "refreshed" 才能 "see" 旧条目。但问题是我昨天删除并重新创建了索引,这意味着它应该有旧条目......所以仍然需要帮助解决这个谜团!
我明白了。该死的,它根本不直观。我希望 GAE 文档在这一点上做得更好...
我的生产数据存储区包含很多以前创建的条目。作为我尝试在 Entry.payee 上进行投影的最新代码的一部分,我不得不将 Entry.payee 的定义从未索引更改为索引,如下所示:
payee = ndb.StringProperty(indexed=True, required=True) # Originally was indexed=False
所以现在所有位于数据存储区中的条目都被投影查询忽略了,因为 payee 上的索引忽略了这些条目。
所以我现在需要做的是以某种方式将所有这些旧实体迁移为 indexed=True.
Update - 这是我进行此迁移的方式。结果比预期的要简单。
def runPayeeTypeMigration(exp_traq_name):
Entry.query(ancestor=exp_traq_key(exp_traq_name)).fetch()
for entry in entries:
entry.put()
这通过将所有条目读入更新的数据结构(Entry.payee 索引=True 的那个)并将其写回数据存储区来工作,这样实体现在将被索引。
我一直在用头撞墙,因为我的 Google App Engine python 项目有一个非常简单的 NDB 投影查询,它在我的本地机器上运行良好,但在部署时神秘地失败了生产。
更神秘...作为测试,我在另一个 属性 上添加了一个相同的投影,它在开发和生产中都有效!有人可以帮忙吗?以下是更多详情:
我有以下代表费用的实体:
class Entry(ndb.Model):
datetime = ndb.DateTimeProperty(indexed=True, required=True)
amount = ndb.IntegerProperty(indexed=False, required=True)
payee = ndb.StringProperty(indexed=True, required=True)
comment = ndb.StringProperty(indexed=False)
# ...
稍后在代码中我正在对 Entry.payee 进行投影(以获取所有收款人的列表)。作为测试,我还在 Entry.datetime:
上添加了一个投影log_msg = '' # For passing debug info to the browser
payeeObjects = Entry.query(ancestor=exp_traq_key(exp_traq_name), projection=[Entry.payee]).fetch()
payees = []
for obj in payeeObjects:
payees.append(obj.payee)
log_msg += '%d payees: %s' % (len(payees), str(payees))
log_msg += ' ------------------- ' # a visual separator
dtObjects = Entry.query(ancestor=exp_traq_key(exp_traq_name), projection=[Entry.datetime]).fetch()
dts = []
for obj in dtObjects:
dts.append(obj.datetime)
log_msg += '%d datetimes: %s' % (len(dts), str(dts))
#...other code, including passing log_msg down to the client
这是开发环境中的输出(注意收款人列表和日期时间列表显示在控制台中):
这是部署到应用引擎时的输出。我无法将其发送到 return 收款人列表。它保持 returning 一个空列表,即使在开发中 returns 列表很好:
我已确保在 GAE 上正确设置了索引:
请帮忙!
2018-12-05更新:
我在生产中添加了更多条目,他们被选中了!见截图。但较旧的条目仍未 returned。
我的第一反应是数据存储索引需要以某种方式 "refreshed" 才能 "see" 旧条目。但问题是我昨天删除并重新创建了索引,这意味着它应该有旧条目......所以仍然需要帮助解决这个谜团!
我明白了。该死的,它根本不直观。我希望 GAE 文档在这一点上做得更好...
我的生产数据存储区包含很多以前创建的条目。作为我尝试在 Entry.payee 上进行投影的最新代码的一部分,我不得不将 Entry.payee 的定义从未索引更改为索引,如下所示:
payee = ndb.StringProperty(indexed=True, required=True) # Originally was indexed=False
所以现在所有位于数据存储区中的条目都被投影查询忽略了,因为 payee 上的索引忽略了这些条目。
所以我现在需要做的是以某种方式将所有这些旧实体迁移为 indexed=True.
Update - 这是我进行此迁移的方式。结果比预期的要简单。
def runPayeeTypeMigration(exp_traq_name):
Entry.query(ancestor=exp_traq_key(exp_traq_name)).fetch()
for entry in entries:
entry.put()
这通过将所有条目读入更新的数据结构(Entry.payee 索引=True 的那个)并将其写回数据存储区来工作,这样实体现在将被索引。