这太奇怪了......
首先,此查询在数据存储区查看器中工作,即。它返回正确的行。
SELECT * FROM Level where short_id = 'Ec71eN'
但如果我跑这个
Level.all().filter("short_id = ", 'Ec71eN').get()
如果我执行此操作,则返回无:
db.GqlQuery("SELECT * FROM Level where short_id = '%s'" % 'Ec71eN').get()
它还会返回无。如果我运行这个:
level = Level.get_by_id(189009)
它返回正确的行(189009是正确行的ID)
困惑?这可能有什么不对?我以前从未见过这样的东西,它在生产中至少工作了几周...我认为我现在至少有两个案例从今天开始起作用。
更新:这不是一个最终一致的问题,因为当我尝试上述时,该行是7个小时。我有两排症状相同,奇怪的是由同一个用户生成的摊位。在我通过上传特殊案例代码(例如:
)完成其ID的手动操作之后,展位“固定”了if short_id==CASE_1_SHORT_ID:
level = Level.get_by_id(CASE_1_ID)
之后,查询正常工作。
答案 0 :(得分:4)
您使用的是HRD吗?没错。你知道它应该最终是正确的吗?
查询操作最终是一致的。 Get-by-id操作完全一致。
您描述的是正确的数据存储行为。数据存储区查看器操作返回正确的结果有点奇怪,但它可能在数据存储区操作中遇到了单独的平板电脑。
答案 1 :(得分:1)
鉴于它是在7小时前创建的,最终的一致性' 通常应该花费几秒到几分钟。 如果最终的一致性是问题,请多次运行相同的查询方法,看看是否返回相同的结果。如果它使用相同的方法连续返回相同的结果,那么很可能不是最终的一致性问题。您应该切换到NDB API以便查询数据 - 它已经好了1000倍,而Guido也在使用它 - 所以你知道它很好。 NDB是否显示相同的不一致性?